View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0001852 | Wishes | Macro | public | 2011-08-14 12: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 12:04 | DAtaMan | New Issue | |
| 2011-08-14 12:04 | DAtaMan | File Added: MacroTimer.diff | |
| 2011-08-14 12:05 | DAtaMan | Note Added: 0007446 | |
| 2011-08-14 13:32 | DrKnS | Note Added: 0007447 | |
| 2011-08-14 13:50 | DAtaMan | Note Added: 0007448 | |
| 2011-08-14 14:05 | DAtaMan | Note Added: 0007449 | |
| 2011-08-14 14:15 | DrKnS | Note Added: 0007450 | |
| 2011-08-14 14:41 | DAtaMan | Note Added: 0007451 | |
| 2011-08-14 14:44 | DrKnS | Note Added: 0007452 | |
| 2011-08-14 15:49 | DAtaMan | Note Added: 0007453 | |
| 2011-08-14 16:08 | DrKnS | Note Added: 0007454 | |
| 2011-08-14 16:57 | DAtaMan | Note Added: 0007455 | |
| 2011-08-14 17:11 | DrKnS | Note Added: 0007456 | |
| 2011-08-14 17:58 | DAtaMan | Note Added: 0007457 | |
| 2011-08-15 05:59 | DAtaMan | File Added: MacroTimer2.diff | |
| 2011-08-15 05:59 | DAtaMan | Note Added: 0007458 | |
| 2011-08-15 14:07 | vskirdin | Note Added: 0007459 | |
| 2011-08-15 15:01 | DAtaMan | Note Added: 0007460 | |
| 2011-08-15 17:05 | vskirdin | Note Added: 0007461 | |
| 2011-08-15 17:25 | vskirdin | Note Added: 0007462 | |
| 2011-08-16 02:27 | DAtaMan | Note Added: 0007463 | |
| 2011-08-16 03:49 | 2useven10 | Note Added: 0007464 | |
| 2011-08-16 03:52 | 2useven10 | Note Edited: 0007464 | |
| 2011-08-16 04:52 | DAtaMan | Note Added: 0007465 | |
| 2011-08-16 07:12 | 2useven10 | Note Added: 0007467 | |
| 2011-08-16 07:15 | DrKnS | Note Added: 0007468 | |
| 2011-08-16 07:24 | 2useven10 | Note Added: 0007469 | |
| 2011-08-16 07:24 | 2useven10 | Note Edited: 0007469 | |
| 2011-08-16 07:50 | vskirdin | Note Added: 0007471 | |
| 2011-08-16 07:50 | vskirdin | Assigned To | => vskirdin |
| 2011-08-16 07:50 | vskirdin | Status | new => feedback |
| 2011-08-16 11:18 | DAtaMan | File Added: general.html.diff | |
| 2011-08-16 11:21 | DAtaMan | Note Added: 0007478 | |
| 2011-08-16 11:21 | DAtaMan | Status | feedback => assigned |
| 2011-08-16 13:18 | JohnDoe | Note Added: 0007479 | |
| 2011-08-16 14:02 | 2useven10 | Note Edited: 0007469 | |
| 2011-08-16 14:33 | 2useven10 | Note Added: 0007480 | |
| 2011-08-16 14:50 | DAtaMan | Note Added: 0007481 | |
| 2011-08-16 15:49 | JohnDoe | Note Added: 0007482 | |
| 2011-08-17 08:24 | vskirdin | Note Added: 0007483 | |
| 2011-08-17 09:41 | DAtaMan | Note Added: 0007484 | |
| 2011-08-17 10:56 | DAtaMan | Note Added: 0007485 | |
| 2011-08-17 11:19 | JohnDoe | Note Added: 0007486 | |
| 2011-08-17 11:55 | DAtaMan | Note Added: 0007487 | |
| 2011-08-17 11:56 | DAtaMan | Note Edited: 0007487 | |
| 2011-08-17 12:38 | JohnDoe | Note Added: 0007488 | |
| 2011-08-28 11:31 | vskirdin | Note Added: 0007562 | |
| 2011-08-28 11:31 | vskirdin | Status | assigned => feedback |
| 2012-06-08 13:47 | DAtaMan | Status | feedback => resolved |
| 2012-06-09 04:57 | vskirdin | Build | => 2150 |
| 2012-06-09 04:57 | vskirdin | Status | resolved => closed |
| 2012-06-09 04:57 | vskirdin | Resolution | open => fixed |
| 2012-06-09 04:57 | vskirdin | Fixed in Version | => 3.0 |
| 2013-02-03 00:33 | alexy | Severity | minor => feature |