Сравнение времени выполнения двух функций
-
function NoOptimizeCode() --[[Предположительно не оптимизированный код]]-- end function OptimizeCode() --[[Предположительно оптимизированный код]]-- end local countRepeat = 10000000 local x1 = 0 local x2 = 0 x1 = os.clock() for i = 1, countRepeat do NoOptimizeCode() end x2 = os.clock() for i = 1, countRepeat do OptimizeCode() end local deltaTimeOptimize = (os.clock() - x2) local deltaTimeNoOptimize = (x2 - x1) print(string.format("%.2f\n", deltaTimeNoOptimize/deltaTimeOptimize))
Пример1. Узнать во сколько раз
string.match()
медленееstring.find()
function NoOptimize() if string.match('mov eax, [edx]', 'edx') then end end function Optimize() if string.find('mov eax, [edx]', 'edx') then end end
Пример2. Создание лишней локальной переменной
local tableA = {'A', 'B', 'C'} function NoOptimize() local t = #tableA for i = 1, t do end end function Optimize() for i = 1, #tableA do end end
Ответы: 1.38, 1.04.
Если значение меньше единицы, то оптимизированный код хуже.
Если значение больше единицы, то стоит использовать более оптимизированный вариант.Для простого поиска лучше использовать
string.find
чемstring.match
.Еще несколько примеров
tableA = {'A', 'B', 'C'} local tableB = {'A', 'B', 'C'} function NoOptimize() for i = 1, #tableA do end end function Optimize() for i = 1, #tableB do end end
1.14
К локальной таблице доступ быстрееfunction NoOptimize() tableA = {'A', 'B', 'C'} end function Optimize() local tableB = {'A', 'B', 'C'} end
Создание новой глобальной и новой локальной таблицы.
1.08Для чего может пригодиться. Может пригодиться при оптимизации кода трассировке на брейкпоинтах в пошаговой отладке
-
С точностью до тысячной доли секунды можно посчитать задержку выполнения кода, что можно применить как счет производительности.
local x = os.clock() local s = 0 for i=1,100000 do s = s + i end print(string.format("elapsed time: %.3f\n", os.clock() - x))
После выполнения, показывает 2 тысячных секунды или 2 мс
elapsed time: 0.002
Можно посчитать прошедшее время для другой цели. Например, если цикл в отладке выполняется более 3 секунд, то это вероятно корневой цикл, а если менее, то это вложенный цикл. На корневом цикле можно остановить трейслог. Об этом может быть потом напишу.