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

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

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

      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
      • MasterGHM Не в сети
        MasterGH Администраторы
        отредактировано

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

        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
        • Первое сообщение
          Последнее сообщение
        Powered by NodeBB | Contributors
        СeLua[RU] 2025©