Измеритель времени исполнения

Здесь обсуждается всё, что касается макросов.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Измеритель времени исполнения

Post by IgorZ »

Данный макрос возник в процессе работы над другими и предназначен определить "на лету" время исполнения фрагмента кода на Lua/Moon.

Клавиша вызова: RCtrlT.

Способ использования: в редакторе выделить фрагмент кода и вызвать макрос. Если ошибок во фрагменте нет, начнётся измерение. После измерения, занимающего некоторое время, будет выведено окно, в котором показан замеряемый фрагмент, среднее время его исполнения и общее время, потребовавшееся на замер. В процессе измерения в заголовке редактора показывается текущее количество итераций, используемое для измерения.


  1. --
  2.  
  3. -- Lua/Moon execution time meter
  4.  
  5. -- Измеритель времени выполнения для Lua/Moon
  6.  
  7. -- (c) IzorZ
  8.  
  9. --
  10.  
  11. -- Инструкция: выделить тестируемый фрагмент, нажать RCtrlT. Если фрагмент не выделен, тестируется весь файл.
  12.  
  13. --
  14.  
  15. -- v 1.0.1 Выкидываются "\r" из переводов строки в показываемом коде. Возможность работы с .fmlua.
  16.  
  17. -- v 1.0.2 На время работы отключается сборщик мусора.
  18.  
  19. --
  20.  
  21. local function CheckTime()
  22.  
  23. local text,f,err = Editor.SelValue
  24.  
  25. if text=="" then
  26.  
  27.   Keys("CtrlA")
  28.  
  29.   text = Editor.SelValue
  30.  
  31.   Editor.Sel(4)
  32.  
  33. end
  34.  
  35. if Editor.FileName:lower():find("lua$") then
  36.  
  37.   f,err = loadstring(text)
  38.  
  39. else
  40.  
  41.   f,err = require"moonscript".loadstring(text)
  42.  
  43. end
  44.  
  45. if err then
  46.  
  47.   far.Message(err,"Error on compile",nil,"lw")
  48.  
  49. else
  50.  
  51.   collectgarbage("stop")
  52.  
  53.   local n,tt,t1,t2 = 10,Far.UpTime
  54.  
  55.   repeat
  56.  
  57.     Editor.SetTitle("  Number of cycles = "..n)
  58.  
  59.     t1 = Far.UpTime
  60.  
  61.     for i = 1,n do f() end
  62.  
  63.     t2 = Far.UpTime
  64.  
  65.     if t2-t1<100 then n =  n*10 end
  66.  
  67.   until t2-t1>=100
  68.  
  69.   Editor.SetTitle()
  70.  
  71.   local dt,tt,type = (t2-t1)/n,(Far.UpTime-tt)/1000,Editor.FileName:match("%.(%a)%a*$"):upper()..Editor.FileName:match("%.%a(%a*)$"):lower()
  72.  
  73.   collectgarbage("restart")
  74.  
  75.   far.Message(text:gsub("\r\n","\n"),"  "..type.." code  ","Execution time: "..(dt<1000 and dt.." m" or (dt/1000).." ").."s. Total test time: "..tt.." s.","l")
  76.  
  77. end
  78.  
  79. end
  80.  
  81. --
  82.  
  83. Macro{ description="Check execution time"; area="Editor"; key="RCtrlT"; filemask="*.lua,*.moon,*.fmlua"; action=CheckTime;}
Attachments
Check_execution_time.1.0.2.7z
(1.02 KiB) Downloaded 80 times
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Re: Измеритель времени исполнения

Post by IgorZ »

Надеюсь, будет полезен всем разработчикам.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

Re: Измеритель времени исполнения

Post by sToLp »

IgorZ
Большое спасибо за полезную публикацию! Однако есть несколько вопросов.
1. В конце строк результирующего окна выставляется ♪ , это поправимо?
2. При неоднократных тестах подряд одного и того же кода каждый последующий тест показывает всё большее и большее время. Но здесь дело, вероятно, вовсе не в макросе.
3. Если запустить макрос из самого себя, то происходит его в Фаре, которая легко исправляется перезагрузкой макросов.
4. А для fmlua-кода плагина можете сделать такой же тест (или дополнить этот)?
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Re: Измеритель времени исполнения

Post by IgorZ »

sToLp wrote:IgorZ
Большое спасибо за полезную публикацию! Однако есть несколько вопросов.
1. В конце строк результирующего окна выставляется ♪ , это поправимо?
Это Lua так не совсем верно обрабатывает переводы строк в стиле Windows.
sToLp wrote:2. При неоднократных тестах подряд одного и того же кода каждый последующий тест показывает всё большее и большее время. Но здесь дело, вероятно, вовсе не в макросе.
Время исполнения фрагмента, как правило, немного плавает. Обычно - то увеличивается, то уменьшается. Это нормально: вряд ли у Вас в компьютере, запущен только Far :).
sToLp wrote:3. Если запустить макрос из самого себя, то происходит его в Фаре, которая легко исправляется перезагрузкой макросов.
Хм. а зачем запускать данный макрос из самого себя, да ещё много раз? Это инструмент разработчика, а данный макрос уже разработан и отлажен.
sToLp wrote:4. А для fmlua-кода плагина можете сделать такой же тест (или дополнить этот)?
А им кто-то ещё пользуется? Кстати, возможно, корректный фрагмент кода из .fmlua макроса исполнится без переделок. Это же, если не путаю, просто обвязка над языком, заключающаяся, в основном, в расширенных возможностях назначения клавиш вызова. А по скорости выполнения представляют интерес, как правило, отдельные фрагменты внутри кода макроса.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Измеритель времени исполнения

Post by John Doe »

>Это Lua так не совсем верно обрабатывает переводы строк в стиле Windows.
Разве Lua?

>Если запустить макрос из самого себя, то происходит множественная регистрация
Не должна, если конечно вы сами себе не сделали глобальной функцию Macro
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

Re: Измеритель времени исполнения

Post by sToLp »

IgorZ wrote:
Привыкнуть было бы можно, если бы от этого была бы польза. А так зачем? Благодарю за поправку!
Хм. а зачем запускать данный макрос из самого себя, да ещё много раз?
Из самого себя удобно его запустить для оперативной проверки работоспособности после внесённых в него изменений — смены ключа, внесения вышеупомянутой правки.
Причем для того, чтобы проявился эффект множественной регистрации макроса запустить его в себе самом достаточно 1 раз. Или это у меня что-то не так настроено?
А им кто-то ещё пользуется?
Судя по тому, что на руборде регулярно обновляется сборка Фара (автор Oldster), в которой присутствует и МакроЛиб, то любители его продолжают использовать.
В частности, кроме богатого репозитория МакроЛибовских макросов, и старых накоплений, которые недосуг переводить в lua-форму, поскольку и в МакроЛибе они отлично работают, есть у меня и несколько привычных мне fmlua-макросов быстрого ввода в комстроку префиксов плагинов, аналога способа запуска которых (т.е. макросов) на lua пока ещё и нету, насколько я знаю. И, увы, тест его не берёт.
John Doe wrote:если конечно вы сами себе не сделали глобальной функцию Macro
А не подскажете ли как это отловить?
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Измеритель времени исполнения

Post by John Doe »

>А не подскажете ли как это отловить?
Из командной строки запустите lua:=Macro
В результате должны увидеть nil.

>И, увы, тест его не берёт.
Надо выделить только тот код, который хотите проверить.
Например, можно всё содержимое внутри фигурных скобок (это можно автоматизировать).

>есть у меня и несколько привычных мне fmlua-макросов быстрого ввода в комстроку префиксов плагинов, аналога способа запуска которых (т.е. макросов) на lua пока ещё и нету, насколько я знаю.
На lua всё это можно, хотя может и не совсем так прямолинейно.

>и старых накоплений, которые недосуг переводить в lua-форму, поскольку и в МакроЛибе они отлично работают
Отсюда вопрос: зачем переводить и так работающий макрос в формат fmlua?
Макросы MacroLib можно использовать параллельно с обычными.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Измеритель времени исполнения

Post by John Doe »

>Для ввода в начало комстроки двух цифр надо быстро дважды подряд нажать клавишу 6.
Не знаю зачем такие хитрости, я бы сделал проще

Code: Select all

local prefixes = {"6", "updex:", "Renewal:"}

local cycle = {}
for i,v in ipairs(prefixes) do
  cycle[v] = prefixes[i+1] or prefixes[1]
end

Macro { --в начале комстроки цифру 6 по кругу менять на префиксы плагинов UpdateEx и Renewal
  description="по кругу [6] - [updex:] - [Renewal:] - [6]";
  area="Shell"; key="6";
  uid="C7C6D188-24EE-4502-9B94-1A9282832033";
  action=function()
    replace = cycle[CmdLine.Value]
    if replace then
      Keys"CtrlY"
      print(replace)
    else
      Keys"AKey"
    end
  end;
}
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

Re: Измеритель времени исполнения

Post by sToLp »

John Doe wrote:Из командной строки запустите lua:=Macro
В результате должны увидеть nil.
А увидел:

Code: Select all

╔══════════════════════════╗
║  1│ function: 0x02c64478 ║
╚═══════ 1 argument ═══════╝
И что это значит не понимаю.
Надо выделить только тот код, который хотите проверить. Например, можно всё содержимое внутри фигурных скобок.
Увы, практически любая часть вышеприведённого макроса даёт ошибку.
На lua всё это можно, хотя и не так прямолинейно.
С интересом посмотрел бы.
Отсюда вопрос: зачем переводить и так работающий макрос в формат fmlua?
Какой макрос Вы имеете ввиду?
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

Re: Измеритель времени исполнения

Post by sToLp »

John Doe wrote:>я бы сделал проще
Что то не кажется мне этот макрос проще. Однако по любому большое за него спасибо!

При этом: и как теперь ввести две шестёрки в начале комстроки? А fmlua-макрос даёт такую возможность.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Измеритель времени исполнения

Post by John Doe »

>И что это значит не понимаю.
Это значит, что в каком-то из других ваших макросов встречается выражение _G.Macro = Macro.
Надо найти и обезвредить.

>Увы, практически любая часть вышеприведённого макроса даёт ошибку.
Во-первых, выделена должна быть некая цельная конструкция.
Во-вторых, бессмысленно обсуждать какую-то ошибку, не приводя её текста.

>Увы, практически любая часть вышеприведённого макроса даёт ошибку.
Сабжевый. Вроде бы вы высказывали заинтересованность в том, чтобы кто-то адаптировал его для MacroLib.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Измеритель времени исполнения

Post by John Doe »

>Что то не кажется мне этот макрос проще.
Вообще-то можно вставить текст вашего fmlua без изменений, и будет работать аналогично.
Я просто усовершенствовал макрос, для того чтобы список префиксов не был размазан по коду, а был задан в одном месте.

>При этом: и как теперь ввести две шестёрки в начале комстроки? А fmlua-макрос даёт такую возможность.
Например можно начать комстроку с пробела.

>С интересом посмотрел бы.
Да пожалуйста, смотрите. Добавляю к вышеприведённому макросу нехитрый condition:

Code: Select all

local prefixes = {"6", "updex:", "Renewal:"}

local cycle = {}
for i,v in ipairs(prefixes) do
  cycle[v] = prefixes[i+1] or prefixes[1]
end

local prev = 0
Macro { --в начале комстроки цифру 6 по кругу менять на префиксы плагинов UpdateEx и Renewal
  description="по кругу [6] - [updex:] - [Renewal:] - [6]";
  area="Shell"; key="6";
  uid="C7C6D188-24EE-4502-9B94-1A9282832033";
  condition=function()
    local time = Far.UpTime; delta = time-prev; prev = time
    return delta>300
  end;
  action=function()
    replace = cycle[CmdLine.Value]
    if replace then
      Keys"CtrlY"
      print(replace)
    else
      Keys"AKey"
    end
  end;
}

User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

Re: Измеритель времени исполнения

Post by sToLp »

John Doe wrote:Это значит, что в каком-то из других ваших макросов встречается выражение _G.Macro = Macro. Надо найти и обезвредить.
Благодарю за разъяснение. Буду искать.
Во-первых, выделена должна быть некая цельная конструкция.
Да это я понимаю и так и делаю.
Во-вторых, бессмысленно обсуждать какую-то ошибку, не приводя её текста.
Простите, теперь уже смогу обстоятельнее ответить только завтра. Благодарю за помощь!
Сабжевый. Вроде бы вы высказывали заинтересованность в том, чтобы кто-то адаптировал его для MacroLib.
Вообще то я полагал, что сам сабжевый макрос останется в lua, а анализировать сможет и fmlua. Но если это для автора не интересно, то и претензий, разумеется, ни каких.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Измеритель времени исполнения

Post by John Doe »

>а анализировать сможет и fmlua
А он и так может. Если конечно код не содержит макролибовских подстановок (инклудов, констант).

Тут надо понимать, и обычный макрофайл нельзя просто так целиком без выделения скармливать измерителю, иначе результат как минимум будет невалиден (как и оказалось в вашем случае, с умножением пунктов, и прогрессирующим замедлением).
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

Re: Измеритель времени исполнения

Post by sToLp »

sToLp wrote:
John Doe wrote:Это значит, что в каком-то из других ваших макросов встречается выражение _G.Macro = Macro. Надо найти и обезвредить.
Благодарю за разъяснение. Буду искать.
Нашёл 1 макрос и отправил в карантин. Теперь сабжевый макрос из самого себя не запускается. Ещё раз благодарю за помощь! Самостоятельно я бы до этого, наверняка, долго бы ещё доходил.
John Doe wrote:>а анализировать сможет и fmlua
А он и так может.
Однако, увы, проведённые тесты дают следующие .
Post Reply

Return to “Обсуждение макросов”