• Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
  • Зарегистрироваться
  • Войти
CELua[RU]
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
  • Зарегистрироваться
  • Войти

Сравнение времени выполнения двух функций

Запланировано Прикреплена Закрыта Перенесена Обучающие примеры
обучалкаce luaoptimization
2 Сообщения 1 Posters 43 Просмотры 1 Watching
Загружаем больше сообщений
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • M Не в сети
    УченикMasterGH Администраторы
    отредактировано MasterGH 5 авг. 2023 г., 04:01 1 апр. 2023 г., 23:02

    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

    Для чего может пригодиться. Может пригодиться при оптимизации кода трассировке на брейкпоинтах в пошаговой отладке

    1 ответ Последний ответ Ответить Цитировать 0
    • M Не в сети
      УченикMasterGH Администраторы
      отредактировано 7 апр. 2023 г., 21:56

      С точностью до тысячной доли секунды можно посчитать задержку выполнения кода, что можно применить как счет производительности.

      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 секунд, то это вероятно корневой цикл, а если менее, то это вложенный цикл. На корневом цикле можно остановить трейслог. Об этом может быть потом напишу.

      1 ответ Последний ответ Ответить Цитировать 0

      • 1 / 1
      1 / 1
      • Первое сообщение
        2/2
        Последнее сообщение
      Powered by NodeBB | Contributors
      СeLua[RU] 2025©