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

    Оптимизация splitDisassembledString()

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

      Напишем функцию, которая в 3.2 раз быстрее splitDisassembledString(disassemble(address))

      \-- Линия: 0045464A - FF 05 A4B54500        - inc [0045B5A4] { [000003EA] }
      
      function GetDebugString(address)
        return splitDisassembledString(disassemble(address))
      end
      
      \-- address, bytes, opcode
      function GetDebugString2(address)
        local clearString = string.gsub(disassemble(address), '%s','')
        return string.match(clearString, '^(.-)%-(.-)%-(.-)$')
      end
      
      function NoOptimizeCode()
        GetDebugString(0x0045464A)
      end
      
      function OptimizeCode()
         GetDebugString2(0x0045464A)
      end
      
      local countRepeat = 100000 -- add more cycle
      local x1 = 0
      local x2 = 0
      
      x1 = getTickCount()
      for i = 1, countRepeat do NoOptimizeCode() end
      x2 = getTickCount()
      for i = 1, countRepeat do OptimizeCode() end
      
      print(string.format("%.2f", (x2 - x1)/(getTickCount() - x2)) )
      

      Сравнивая скорости получаем оптимизацию в ~3.20 раза быстрее.
      Пример использования

      function GetDebugString2(address)
        local clearString = string.gsub(disassemble(address), '%s','')
        return string.match(clearString, '^(.-)%-(.-)%-(.-)$')
      end
      
      local address, bytes, opcode = GetDebugString2(0x0045464A)
      
      print(address)
      print(bytes)
      print(opcode)
      

      gsub очищает пробелы, а выражение '^(.-)%-(.-)%-(.-)$' позволит захватить данные между тире в строке.
      Может пригодится, когда трейсим своим Lua кодом.
      Если заинтересовали регулярки: ссылка

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

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