LINUX.ORG.RU

Оптимизация кода TCL


0

0

Помогите оптимизировать следующий кусок кода. Операции (Haar-Wavelet-Transformation) проводятся над графическими файлами которые могут иметь довольно большой размер. Поэтому важна каждая миллисекунда..

set matrix ""
set matrix2 ""

set matrix [read $in]
close $in

for {set yy 0} {$yy < $y} {incr yy} {
	set mids ""
	set ints ""
	for {set xx 0} {$xx < $x} {incr xx 2} {
		set a  [ expr {$x * $yy + $xx} ]
		set b  [ expr {$a+1} ]
		set aa [ lindex $matrix $a ]
		set bb [ lindex $matrix $b ]
		set middle [ expr { [ expr {$aa + $bb} ] / 2 } ]
		set mids [concat $mids $middle]
		set int [ expr {$aa-$middle+$grey2} ]
		set ints [concat $ints $int]
	}
	set matrix2 [ concat $matrix2 $mids $ints ]
}

for {set xx 0} {$xx < $x} {incr xx} {
	for {set yy 0} {$yy < $y} {incr yy 2} {
		set a  [ expr {$x * $yy + $xx} ]
		set b  [ expr {$a + $x} ]
		set aa [ lindex $matrix2 $a ]
		set bb [ lindex $matrix2 $b ]
		
		set middle [ expr { [ expr {$aa + $bb} ] / 2 } ]
		set pos [ expr {$yy/2 * $x + $xx} ]
		lset matrix $pos $middle
				
		set int [ expr {$aa-$middle+$grey2} ]
		set pos [ expr {($yy/2+$y/2)*$x + $xx} ]
		lset matrix $pos $int
	}	
}

p.s. я только начал заниматся tcl, поэтому не ругайтесь если очень криво...

ЗАРАНЕЕ СПАСИБО!

>>важна каждая миллисекунда..

Это несовместимо с tcl-ем. Есть же BLT-extension для tcl, где введены вектора, специально для численных рассчетов. Добавить к ним tcl команду , которая будет выполнять все твои преобразования Хаара на уровне С-кода.

geekkoo
()
Ответ на: комментарий от Miguel

Почему же. Нормально, только численные рассчеты лучше делать на интерпретируемых языках с уже готовой векторизацией. Кстати, если товарищ Muxxa реализует свой алгоритм пусть даже в TCL, но в виде операций с BLT векторами, то даже в этом случае будет значительный прирост в скорости.

geekkoo
()
Ответ на: комментарий от Begemoth

Нет сербряной пули. Какой-то участок кода легче выполнить на одном языке, какой-то - на другом. Многослойные программы рулят!

geekkoo
()

1. переменная b насколько понимаю вообще в коде не нужна, 
   вместо неё можно (и нужно) использовать a
то есть вместо 
  set b  [ expr {$a + $x} ]
  set aa [ lindex $matrix2 $a ]
  set bb [ lindex $matrix2 $b ]
будет 
  set aa [ lindex $matrix2 $a ]
  incr a $x
  set bb [ lindex $matrix2 $b ]
по идее уже чутка быстрее

2. для того чтобы добавить элемент к списку лучше использовать lappend,
то есть вместо set mids [concat $mids $middle]
писать lappend mids $middle

3 и последнее, еще раз подумать над алгоритмом и провести его оптимизацию.
приведённый Вами код может быть оптимизирован, причём оптимизация алгоритма не зависит от платформы :) Полученная практика пригодится для любого языка
 

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Огромное спасибо MKuznetsov! lappend на самом деле немного прибавил скорости! Но не зеачительно. Узким местом оказалось отсутствие процедур!!! Код программки получился довольно маленьким - меньше 100 строк, и решил обойтись без процедур.. После того как я разбил весь код на 5 основных секций, запихнул каждую в отдельную процедуру, настроил передачу паременных - прирост в скорости более чем в 2 раза!!!! 

Интересно с чем это связанно...

2 geekkoo: попробуемс!) спс

P.S. Возможно на других языках это можно было сделать лучше или быстрее, но в постановке задачи стояло именно TCL!)) Нам студентам особенно выбирать не приходится!)) На чём скажут на том и клипаем..)) 

P.P.S. Программу сдал на отл) 

Muxxxa
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.