пятница, 30 апреля 2010 г.

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

Все кто пишет на AutoIt`е жалуются на медленность кода. Ну я тоже не исключение=) Вот и решил провести маленькое исследование - какая из функций будет работать быстрее - так, которая вызывается из UDF,  описанная в текущем файле или сразу код функции? До начала самого исследования думалось что по скорости они будут расположены так:

1. Сам код функции

2. Описанная в текущем файле

3. Вызываемая из UDF

Итак, для теста было создано два файла:

головной:


#include <TEST.au3>

;Немного подождём - что бы скрипт нормально загрузился и размялся перед боем
$SUM = 0
For $J = 1 To 1000
$SUM += TEST()
Next

;Здесь - для конкретного кода, а не вызывания функции
$time3 = TimerInit()
$SUM = 0
For $J = 1 To 1000
$RET = 0
For $I = 1 To 100
$RET *= $I
Next
$SUM += $RET
Next
$time3 = TimerDiff($time3)
;Здесь будем замерять время для функции вызванной из UDF
$time1 = TimerInit()
$SUM = 0
For $J = 1 To 1000
$SUM += TEST()
Next
$time1 = TimerDiff($time1)
;А здесь - для описанной ниже
$time2 = TimerInit()
$SUM = 0
For $J = 1 To 1000
$SUM += TEST2()
Next
$time2 = TimerDiff($time2)

MsgBox(0,"Результаты", "Из UDF: " & $time1 & Chr(13) & "Внутри: " & $time2 & Chr(13) & "Код: " & $time3)

Func TEST2()
$RET = 0
For $I = 1 To 100
$RET *= $I
Next
Return
EndFunc


TEST.au3 :

Func TEST()
$RET = 0
For $I = 1 To 100
$RET *= $I
Next
Return
EndFunc


Итак, после 10 замеров получили вот такой результат:

1. Сам код функции, а не её вызов

2 и 3 Вызов из UDF и вызов их текущего файла

Причём, влияет порядок следования функций. Например если сначала замерять time1, а потом time2, то time1 будет больше. Если наоборот, т.е. сначала time2, потом time1, то time2 будет больше. 

Итак, резюмирую:

  • На скорость работы скрипта не влияет расположение функции - она может быть описана как в отдельном файле, так и в текущем.
  • Отказ от функций и использование непосредственно кода этой функции даёт существенный прирост скорости.




2 комментария:

  1. Отказ от функций и использование непосредственно кода этой функции даёт существенный прирост скорости.

    Хм... А если функцию придётся вызывать 10 раз, то и придётся код её 10 раз писать?! Не порядок...

    ОтветитьУдалить
  2. Это все написано для AutoIT, там это даст неплохой прирост скорости, а в некоторых моментах это критично, да и функции эти как правило не большие, не больше 10 строк. Не пробовал для других компиляторов, но думаю там такой проблемы нет =)

    ОтветитьУдалить