View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0001852 | Wishes | Macro | public | 2011-08-14 13:04 | 2013-02-03 00:33 |
Reporter | DAtaMan | Assigned To | vskirdin | ||
Priority | normal | Severity | feature | Reproducibility | have not tried |
Status | closed | Resolution | fixed | ||
Product Version | 3.0 | ||||
Fixed in Version | 3.0 | ||||
Summary | 0001852: Макрокоманда Timer | ||||
Description | Служит для получения текущего значения счётчика производительности в миллисекундах | ||||
Additional Information | Синтаксис: Timer([Type]) где Type - тип используемого счётчика 0 (по-умолчанию) - используется GetTickCount 1 - используются QueryPerformance* | ||||
Tags | No tags attached. | ||||
Build | 2150 | ||||
|
MacroTimer.diff (2,824 bytes)
Index: macro.cpp =================================================================== --- macro.cpp (revision 6557) +++ macro.cpp (working copy) @@ -348,6 +348,7 @@ static bool stringFunc(const TMacroFunction*); static bool substrFunc(const TMacroFunction*); static bool testfolderFunc(const TMacroFunction*); +static bool timerFunc(const TMacroFunction*); static bool trimFunc(const TMacroFunction*); static bool ucaseFunc(const TMacroFunction*); static bool usersFunc(const TMacroFunction*); @@ -438,6 +439,7 @@ {L"STRING", 1, 0, MCODE_F_STRING, nullptr, 0,nullptr,L"S=String(V)",0,stringFunc}, {L"SUBSTR", 3, 1, MCODE_F_SUBSTR, nullptr, 0,nullptr,L"S=substr(S,start[,length])",0,substrFunc}, {L"TESTFOLDER", 1, 0, MCODE_F_TESTFOLDER, nullptr, 0,nullptr,L"N=testfolder(S)",0,testfolderFunc}, + {L"TIMER", 1, 1, MCODE_F_TIMER, nullptr, 0,nullptr,L"N=Timer([Type])",0,timerFunc}, {L"TRIM", 2, 1, MCODE_F_TRIM, nullptr, 0,nullptr,L"S=Trim(S[,N])",0,trimFunc}, {L"UCASE", 1, 0, MCODE_F_UCASE, nullptr, 0,nullptr,L"S=UCase(S1)",0,ucaseFunc}, {L"WAITKEY", 2, 2, MCODE_F_WAITKEY, nullptr, 0,nullptr,L"V=Waitkey([N,[T]])",0,waitkeyFunc}, @@ -2147,6 +2149,25 @@ return !strKeyText.IsEmpty()?true:false; } +// V=Timer([Type]) +static bool timerFunc(const TMacroFunction*) +{ + long Type=(long)VMStack.Pop().getInteger(); + if (!Type) + { + VMStack.Push((__int64) GetTickCount()); + } + else + { + __int64 Frequency, Counter; + QueryPerformanceFrequency((LARGE_INTEGER *) &Frequency); + QueryPerformanceCounter((LARGE_INTEGER *) &Counter); + VMStack.Push((Counter*1000)/Frequency); + } + + return true; +} + // V=waitkey([N,[T]]) static bool waitkeyFunc(const TMacroFunction*) { Index: syslog.cpp =================================================================== --- syslog.cpp (revision 6557) +++ syslog.cpp (working copy) @@ -1168,6 +1168,7 @@ DEF_MCODE_(F_SLEEP), DEF_MCODE_(F_STRING), DEF_MCODE_(F_SUBSTR), + DEF_MCODE_(F_TIMER), DEF_MCODE_(F_UCASE), DEF_MCODE_(F_WAITKEY), DEF_MCODE_(F_XLAT), Index: macroopcode.hpp =================================================================== --- macroopcode.hpp (revision 6557) +++ macroopcode.hpp (working copy) @@ -190,6 +190,7 @@ MCODE_F_SLEEP, // Sleep(N) MCODE_F_STRING, // S=string(V) MCODE_F_SUBSTR, // S=substr(S,start[,length]) + MCODE_F_TIMER, // S=Timer([Type]) MCODE_F_UCASE, // S=ucase(S1) MCODE_F_WAITKEY, // V=waitkey([N,[T]]) MCODE_F_XLAT, // S=xlat(S) |
|
Ещё и RDTSC, наверное, будет лишним? :) |
|
А зачем ветка с GetTickCount()? |
|
Да тоже думал её убрать, потом оставил для "комплекта". |
|
Может отсчёт вести со времени запуска Far? |
|
А смысл? |
|
Если запоминать Counter до загрузки плагинов/макросов, то для бенчмарка загрузки, например. |
|
логично. |
|
Если развить идею, можно иметь на борту уже запомненные тайминги. Тогда можно сделать так: Timer() - возвращает RunningTime Timer(1) - время загрузки конфигурации Timer(2) - -"-"-"-"-"-"-"- плагинов Timer(3) - -"-"-"-"-"-"-"- макросов Timer(4) - -"-"-"-"-"-"-"- историй ... Каждый шаг таймировать, это конечно перебор, но важные участки можно было бы. |
|
Макросы как бы для пользователей. Зачем это всё _пользователю_? Столь тонкие моменты должны волновать лишь разработчиков. |
|
А в баг-репортах не пригодится? Если какое-то из времён слишком велико - ССЗБ. |
|
Для багрепортов есть far /p и far /m. Это всяко проще, чем заставлять пользователя писать и исполнять макросы :) В конфиге тормозить нечему, а истории сейчас в бд и загружаются при необходимости, а не сразу. |
|
Логично. :) Тогда, наверное, стоит переименовать функцию в RunningTime и избавиться от GetTickCount. Может и другие мнения будут. Завтра. :) |
|
MacroTimer2.diff (3,400 bytes)
Index: macro.cpp =================================================================== --- macro.cpp (revision 6562) +++ macro.cpp (working copy) @@ -119,6 +119,7 @@ {2, L"Far.Width", MCODE_V_FAR_WIDTH,0}, {2, L"Far.Height", MCODE_V_FAR_HEIGHT,0}, {2, L"Far.Title", MCODE_V_FAR_TITLE,0}, + {2, L"Far.Running", MCODE_V_FAR_RUNNING,0}, {2, L"MacroArea", MCODE_V_MACROAREA,0}, {2, L"ItemCount", MCODE_V_ITEMCOUNT,0}, // ItemCount - ����� ��������� � ������ ������ @@ -458,6 +459,7 @@ TVarTable glbVarTable; TVarTable glbConstTable; +__int64 FarStartedCounter; static TVar __varTextDate; @@ -1068,6 +1070,12 @@ Console.GetTitle(strFileName); Cond=strFileName.CPtr(); break; + case MCODE_V_FAR_RUNNING: + __int64 Frequency, Counter; + QueryPerformanceFrequency((LARGE_INTEGER *) &Frequency); + QueryPerformanceCounter((LARGE_INTEGER *) &Counter); + Cond=((Counter-FarStartedCounter)*1000)/Frequency; + break; case MCODE_V_MACROAREA: Cond=GetSubKey(CtrlObject->Macro.GetMode()); break; Index: syslog.cpp =================================================================== --- syslog.cpp (revision 6562) +++ syslog.cpp (working copy) @@ -1275,6 +1275,7 @@ DEF_MCODE_(V_EDITORSELVALUE), DEF_MCODE_(V_MENU_VALUE), DEF_MCODE_(V_FAR_HEIGHT), + DEF_MCODE_(V_FAR_RUNNING), DEF_MCODE_(V_FAR_TITLE), DEF_MCODE_(V_FAR_WIDTH), DEF_MCODE_(V_HEIGHT), Index: macroopcode.hpp =================================================================== --- macroopcode.hpp (revision 6562) +++ macroopcode.hpp (working copy) @@ -289,6 +289,7 @@ MCODE_V_FAR_WIDTH=KEY_MACRO_V_BASE,// Far.Width - ������ ���������� ���� MCODE_V_FAR_HEIGHT, // Far.Height - ����� ���������� ���� MCODE_V_FAR_TITLE, // Far.Title - ������ ��������� ���������� ���� + MCODE_V_FAR_RUNNING, // Far.Running - ���� ����� Far � ������������ MCODE_V_MACROAREA, // MacroArea - �� ������ ������ ������� MCODE_V_APANEL_CURRENT, // APanel.Current - �� ����� �� �������� ������ Index: macro.hpp =================================================================== --- macro.hpp (revision 6562) +++ macro.hpp (working copy) @@ -344,3 +344,5 @@ const wchar_t *eStackAsString(int Pos=0); inline bool IsMenuArea(int Area){return Area==MACRO_MAINMENU || Area==MACRO_MENU || Area==MACRO_DISKS || Area==MACRO_USERMENU || Area==MACRO_AUTOCOMPLETION;} + +extern __int64 FarStartedCounter; \ No newline at end of file Index: main.cpp =================================================================== --- main.cpp (revision 6562) +++ main.cpp (working copy) @@ -64,6 +64,7 @@ #include "console.hpp" #include "configdb.hpp" #include "palette.hpp" +#include "macro.hpp" #ifdef DIRECT_RT int DirectRT=0; @@ -392,8 +393,10 @@ int _cdecl wmain(int Argc, wchar_t *Argv[]) { std::set_new_handler(nullptr); + QueryPerformanceCounter((LARGE_INTEGER *) &FarStartedCounter); + GetVersionEx(&WinVer); - + // Starting with Windows Vista, the system uses the low-fragmentation heap (LFH) as needed to service memory allocation requests. // Applications do not need to enable the LFH for their heaps. if(WinVer.dwMajorVersion<6) |
|
Функция переделана в псевдопеременную Far.Running |
|
может имеет смысл эту штуку обозвать Far.UpTime ы? Running - сразу наводит на мысль об ответе на бессмысленный вопрос "ФАР запущен?" :-) |
|
> может имеет смысл эту штуку обозвать Far.UpTime Пожалуй, имеет. Новый патч же не нужен? :-) |
|
нет, не нужен |
|
в каких единицах... что возвращает Far.UpTime? |
|
Миллисекунды. |
|
Если uptime и миллисекунды, зачем PerformanceCounter? imho GetTickCounter() достаточно, и проблем будет меньше. Если речь идёт о точном времени стартапа - тогда другое дело, но в этом случае не надо сбрасывать точность до миллисекунд. |
|
> GetTickCounter() достаточно, и проблем будет меньше. Каких проблем? Изначально функция задумывалась для профайлинга макросов. Да и на форуме были "хотелки" о таймере. |
|
1. ф-я предназначена для измерения Коротких промежутков времени с большой точностью (точность 1 ms делает её полезность сомнительной). 2. (из MSDN) Remarks On a multiprocessor computer, it should not matter which processor is called. However, you can get different results on different processors due to bugs in the basic input/output system (BIOS) or the hardware abstraction layer (HAL). To specify processor affinity for a thread, use the SetThreadAffinityMask function. 3. на некоторых системах при включении поверсэйва точность ф-и падает вместе с понижением частоты процессора (MS по-моему это не признаёт)... |
|
> Если uptime и миллисекунды, зачем PerformanceCounter? > imho GetTickCounter() достаточно, и проблем будет меньше Потому что у GetTickCount() точность на уровне ± лапоть: The resolution of the GetTickCount function is limited to the resolution of the system timer, which is typically in the range of 10 milliseconds to 16 milliseconds. |
|
timeGetTime / timeBeginPeriod -- не бесплатно, потери на повышении частоты перепланировки. ps: я ничего не имею против использования QueryPerformanceCounter для замеров временных интервалов порядка нескольких секунд, но тогда надо использовать максимальную точность. |
|
build 2150 |
|
general.html.diff (4,748 bytes)
Index: general.html =================================================================== --- general.html (revision 6572) +++ general.html (working copy) @@ -106,11 +106,11 @@ </tr> <tr> <td><a name="IsUserAdmin">IsUserAdmin</a></td> - <td>Far ������ ��� ���������������?</td> + <td>Far Manager ������ ��� ���������������?</td> </tr> <tr> <td><a name="Fullscreen">Fullscreen</a></td> - <td>FAR �������� � ������� ������?</td> + <td>Far Manager �������� � ������� ������?</td> </tr> </table> @@ -129,19 +129,24 @@ <tr> <td><a name="Far.Width">Far.Width</a></td> <td>Number</td> - <td>������ �������, � ������� �������� FAR Manager</td> + <td>������ �������, � ������� �������� Far Manager</td> </tr> <tr> <td><a name="Far.Height">Far.Height</a></td> <td>Number</td> - <td>����� �������, � ������� �������� FAR Manager</td> + <td>����� �������, � ������� �������� Far Manager</td> </tr> <tr> <td><a name="Far.Title">Far.Title</a></td> <td>String</td> - <td>������ ��������� ���������� ���� FAR</td> + <td>������ ��������� ���������� ���� Far Manager</td> </tr> <tr> + <td><a name="Far.UpTime">Far.UpTime</a></td> + <td>Number</td> + <td>������ ������� (� ������������) �������� Far Manager (��� ������� �� ������ ��������� �����)</td> + </tr> + <tr> <td><a name="Title">Title</a></td> <td>String</td> <td>��������� ������� ������</td> @@ -545,7 +550,7 @@ <td>%L</td> <td><p>�������, ��������� ��� �������� ����� � ���� ������ - ����������/�������.</p> - <p>FAR ���������� � ������ 2 ������ ������������:</p> + <p>Far Manager ���������� � ������ 2 ������ ������������:</p> <p>1) ���������� ����������� ����� � ���� ������</p> <p>2) �����������, ������������� ���������� ������� ���������� (<code>LOCALE_USER_DEFAULT</code>)</p> @@ -692,8 +697,8 @@ <td>16-���� ������ �� OEM ���������</td> </tr> </table> - ���� �������� <var>format</var> �� ������, �� FAR ����� ���������� �������� ������ <code><span class="nobr">"%a %b %d %H:%M:%S %Z %Y"</span></code> (��.). - <!--���� �������� <var>format</var> �� ������, �� FAR ����� ���������� �������� + ���� �������� <var>format</var> �� ������, �� Far Manager ����� ���������� �������� ������ <code><span class="nobr">"%a %b %d %H:%M:%S %Z %Y"</span></code> (��.). + <!--���� �������� <var>format</var> �� ������, �� Far Manager ����� ���������� �������� ������ "%a %b %d %H:%M:%S %Z %Y" (��.).--> </td> </tr> @@ -961,8 +966,8 @@ <tr><td>3</td><td>��������� Windows Clipboard �� ���������� ����� ������; �������� <var>Value</var> �����������; � ����� ����� ��������� 0</td></tr> <tr><td>4</td><td>��������� ���������� ����� ������ � Windows Clipboard; �������� <var>Value</var> �����������; � ����� ����� ��������� 0</td></tr> <tr><td>5</td><td><p>����� ����� � ������� ������.</p> - <p>�� ������� � ������ ����������/������� ���� FAR �������� � ������� ������ Windows.</p> - <p>����� '<code>clip(5)</code>' �������� � ������� ������ ������� �������� ���������� ������� FAR �� ����� �/��� ����������� ������ ������ Windows.</p> + <p>�� ������� � ������ ����������/������� ���� Far Manager �������� � ������� ������ Windows.</p> + <p>����� '<code>clip(5)</code>' �������� � ������� ������ ������� �������� ���������� ������� Far Manager �� ����� �/��� ����������� ������ ������ Windows.</p> <p><var>Value</var> ����� �� ����� ��:</p> <table class="cont2 params lite tiny"> <col class="value"> @@ -1164,7 +1169,7 @@ <tr><th><var>Mode</var></th><th>��������</th></tr> <tr><td>0</td><td><p>������� ���������������������, ������� ������� <var>S</var>.</p> <p>���� <var>S</var> �������� ������������� �����, �� ��������������������� �������� �� �����.</p> - <p>FAR ����������� ���������������� <var>S</var>. ���� ��� �����, �� �������� ������� ������� �������� + <p>Far Manager ����������� ���������������� <var>S</var>. ���� ��� �����, �� �������� ������� ������� �������� � ������� ������� ���������������� <var>S</var>. ����� ��������� <var>S</var> ��������� ������ ���������� �������.</p> </td></tr> <tr><td>1</td><td>�������� ���������������������, ������� ������� <var>S</var>, |
|
> тогда надо использовать максимальную точность В макросах, микросекунды особого смысла, как бы не имеют Приложил diff для Писания. Попутно заменил Far/FAR на Far Manager (только в general.html) |
|
>В макросах, микросекунды особого смысла, как бы не имеют Спорно. Допустим, макрос выполняется примерно 1 миллисекунду (а он, гипотетически, может вызываться и сто раз в секунду). |
|
Ну это просто мнение, что меня смущает: 1) неудачное название - для классического uptime использовать QPC плохая идея, за неделю разница с реальностью может быть достаточно велика. 2) совершенно незачем терять информацию (точность). Как-то так: Far.WorkCounter() mksec... (зы: это моё последнее выступление на эту тему :) |
|
Макрос %a=Far.UpTime; $Rep(1000) $End %b=Far.UpTime; Print(%b-%a) выполняется за 170-190 миллисекунд. Делим на 1000 - трёх знаков после запятой разве недостаточно? А зачем неделями держать Far запущенным? :) |
|
>Делим на 1000 - трёх знаков после запятой разве недостаточно? Вот-вот, об этом и речь: этих самых делений и хотелось бы избежать (если возможно). >А зачем неделями держать Far запущенным? :) А зачем его не держать запущенным? |
|
че решили то? |
|
Да всё равно, лишь бы было. Просто думаю, что если нет угрозы для жизни, то важность микросекунд для человека сильно преувеличена. :) |
|
> Вот-вот, об этом и речь: этих самых делений и хотелось бы избежать (если возможно). Этим самым вы принуждаете других пользователей выполнять это самое деление. Ведь в большинстве случаев будут использоваться только секунды, реже миллисекунды. Можно реальный пример использования микросекунд в макросах? |
|
Если бы только оно: само деление выполнить очень легко. Мне не нравится танцы с запихиванием содержимого макроса в цикл. Как вариант, возвращать в (милли)секундах, но с дробной частью. |
|
> Как вариант, возвращать в (милли)секундах, но с дробной частью. Тогда более логичными будут секунды с дробной частью? Устраивает? |
|
Чтобы понять как лучше - надо вначале попользоваться, поэтому прошу рассматривать мои соображения не более чем информацию к размышлению. Не исключено что и миллисекунд на практике окажется достаточно :-) |
|
Удовлетворение полное? Закрываем? |
Date Modified | Username | Field | Change |
---|---|---|---|
2011-08-14 13:04 | DAtaMan | New Issue | |
2011-08-14 13:04 | DAtaMan | File Added: MacroTimer.diff | |
2011-08-14 13:05 | DAtaMan | Note Added: 0007446 | |
2011-08-14 14:32 | DrKnS | Note Added: 0007447 | |
2011-08-14 14:50 | DAtaMan | Note Added: 0007448 | |
2011-08-14 15:05 | DAtaMan | Note Added: 0007449 | |
2011-08-14 15:15 | DrKnS | Note Added: 0007450 | |
2011-08-14 15:41 | DAtaMan | Note Added: 0007451 | |
2011-08-14 15:44 | DrKnS | Note Added: 0007452 | |
2011-08-14 16:49 | DAtaMan | Note Added: 0007453 | |
2011-08-14 17:08 | DrKnS | Note Added: 0007454 | |
2011-08-14 17:57 | DAtaMan | Note Added: 0007455 | |
2011-08-14 18:11 | DrKnS | Note Added: 0007456 | |
2011-08-14 18:58 | DAtaMan | Note Added: 0007457 | |
2011-08-15 06:59 | DAtaMan | File Added: MacroTimer2.diff | |
2011-08-15 06:59 | DAtaMan | Note Added: 0007458 | |
2011-08-15 15:07 | vskirdin | Note Added: 0007459 | |
2011-08-15 16:01 | DAtaMan | Note Added: 0007460 | |
2011-08-15 18:05 | vskirdin | Note Added: 0007461 | |
2011-08-15 18:25 | vskirdin | Note Added: 0007462 | |
2011-08-16 03:27 | DAtaMan | Note Added: 0007463 | |
2011-08-16 04:49 | 2useven10 | Note Added: 0007464 | |
2011-08-16 04:52 | 2useven10 | Note Edited: 0007464 | |
2011-08-16 05:52 | DAtaMan | Note Added: 0007465 | |
2011-08-16 08:12 | 2useven10 | Note Added: 0007467 | |
2011-08-16 08:15 | DrKnS | Note Added: 0007468 | |
2011-08-16 08:24 | 2useven10 | Note Added: 0007469 | |
2011-08-16 08:24 | 2useven10 | Note Edited: 0007469 | |
2011-08-16 08:50 | vskirdin | Note Added: 0007471 | |
2011-08-16 08:50 | vskirdin | Assigned To | => vskirdin |
2011-08-16 08:50 | vskirdin | Status | new => feedback |
2011-08-16 12:18 | DAtaMan | File Added: general.html.diff | |
2011-08-16 12:21 | DAtaMan | Note Added: 0007478 | |
2011-08-16 12:21 | DAtaMan | Status | feedback => assigned |
2011-08-16 14:18 | JohnDoe | Note Added: 0007479 | |
2011-08-16 15:02 | 2useven10 | Note Edited: 0007469 | |
2011-08-16 15:33 | 2useven10 | Note Added: 0007480 | |
2011-08-16 15:50 | DAtaMan | Note Added: 0007481 | |
2011-08-16 16:49 | JohnDoe | Note Added: 0007482 | |
2011-08-17 09:24 | vskirdin | Note Added: 0007483 | |
2011-08-17 10:41 | DAtaMan | Note Added: 0007484 | |
2011-08-17 11:56 | DAtaMan | Note Added: 0007485 | |
2011-08-17 12:19 | JohnDoe | Note Added: 0007486 | |
2011-08-17 12:55 | DAtaMan | Note Added: 0007487 | |
2011-08-17 12:56 | DAtaMan | Note Edited: 0007487 | |
2011-08-17 13:38 | JohnDoe | Note Added: 0007488 | |
2011-08-28 12:31 | vskirdin | Note Added: 0007562 | |
2011-08-28 12:31 | vskirdin | Status | assigned => feedback |
2012-06-08 14:47 | DAtaMan | Status | feedback => resolved |
2012-06-09 05:57 | vskirdin | Build | => 2150 |
2012-06-09 05:57 | vskirdin | Status | resolved => closed |
2012-06-09 05:57 | vskirdin | Resolution | open => fixed |
2012-06-09 05:57 | vskirdin | Fixed in Version | => 3.0 |
2013-02-03 00:33 | alexy | Severity | minor => feature |