![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как засечь время выполнения другой программы? [D7, XP]
sashap © (2008-03-20 19:23:00)Нужно засечь время выполнения другой программы с точностью до 1 мсек.
Как это лучше всего сделать? Определить разницу во времени до и после запуска другой программы? Может, в Делфи есть уже готовые функции?
Спасибо за внимание!
Семеныч (2008-03-20 20:22:00) [1]> sashap (20.03.08 20:10) [14]
И если Вам действительно нужна точность, то очень советую серьезно подумать над [15]. Потому что реальное время работы однойпрограммы (а не всейсистемы со всей кучей программ в ней) дает как раз GetProcessTimes.
Семеныч (2008-03-20 20:19:00) [2]> sashap (20.03.08 20:10) [14]
А теперь пишем правильныйпример. Выбрасывая лишнее и добавляя нужное.
:o)
var
i: dword;
pi: TProcessInformation;
si: TStartupInfo;
begin
FillChar(si, sizeof(TStartupInfo), 0);
si.cb := SizeOf(TStartupInfo);
i := GetTickCount; // Здесь, а не в начале.
if CreateProcess('D:\test.exe', nil, nil, nil, false, 0, nil, nil, si, pi) then
begin
CloseHandle(pi.hThread);
WaitForSingleObject(pi.hProcess, INFINITE);
ShowMessage(IntToStr(GetTickCount - i));
CloseHandle(pi.hProcess);
end;
end;
ЦУП (2008-03-20 20:14:00) [3]
> Точность мне нужна, чтобы сравнить два схожих алгоритма
> на одном компе.
Как раз ошибочно засекаешь время. таким образом не сравнишь реальное время работы твоего алгоритма. Учти, что во время выполнения твоего приложения происходит постоянное переключение потоков и приложений.
Для точного вычисления времени воспользуйся GetProcessTimes/GetThreadTimes. Так тебе удастся вычислить точно, сколько процессорного времени заняло выполнение твоего алгоритма.
sashap (2008-03-20 20:10:00) [4]Семеныч, Palladin, Leonid Troyanovsky, ЦУП- огромное вам спасибо!
Семеныч, спасибо за пример. Покопавшись в интернете вот дописал код:
var
i,j:dword;
pi: TProcessInformation;
si: TStartupInfo;
begin
i:=GetTickCount;
FillChar(pi, sizeof(TProcessInformation), 0);
FillChar(si, sizeof(TStartupInfo), 0);
si.cb := sizeof(TStartupInfo);
CreateProcess('D:\test.exe',
nil, nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, si, pi);
WaitForSingleObject(PI.hProcess,INFINITE);
j:=GetTickCount;
showmessage(inttostr(j-i));
end;
Точность мне нужна, чтобы сравнить два схожих алгоритма на одном компе. Т.е. реальное время неважно. Я предполагаю, что для этого нужно каждую прогу запустить несколько раз и вычислить среднее арифметическое.
ЦУП (2008-03-20 19:53:00) [5]Если нужно посчитать, какое время приложение РЕАЛЬНО работает, то GetProcessTimes. Тогда точности хватит с лихвой.
Leonid Troyanovsky (2008-03-20 19:53:00) [6]
> Семеныч (20.03.08 19:29) [3]
> > с точностью до 1 мсек.
> А вот это вряд ли получится.
GetProcessTimes
--
Regards, LVT.
Palladin (2008-03-20 19:51:00) [7]что бы вставить в него проверку Terminate котору я вставить забыл :)
Семеныч (2008-03-20 19:50:00) [8]> Palladin © (20.03.08 19:48) [7]
Если недолгий одноразовый эксперимент, то ничего страшного.
Если нет, то не Real-Time, но все равно повышенный.
Семеныч (2008-03-20 19:50:00) [9]Кстати, если недолгий одноразовый эксперимент, то и второй поток не нужен.
Семеныч (2008-03-20 19:48:00) [10]Зачем цикл ожидания? Просто WaitForSingleObject(PI.hProcess, INFINITE)
Palladin (2008-03-20 19:48:00) [11]издеваешься? :) да аффтара линчуют за такие дела! :))
Семеныч (2008-03-20 19:46:00) [12]Возможно, точность повысится, если и своей, и запускаемой программе поставить Real-Time приоритет.
Palladin (2008-03-20 19:36:00) [13]
> с точностью до 1 мсек.
до 100 может и получится, учитывая еще и Семеныч (20.03.08 19:28) [2] второй абзац, то даже я бы сказал и до 200, и вообще... куча факторов зависимости...
Palladin (2008-03-20 19:35:00) [14]
> Может, в Делфи есть уже готовые функции?
а еще она кофе подносить умеет и мух отгонять... а что она вытворяет с комарами... ууу....
создаем отдельный поточек, который запускает процессик таким образом
Type
TMyThread=Class(TThread)
Private
Procedure Execute; Override;
Public
Constructor Create;
End;
Constructor TMyThread.Create;
Begin
FreeOnTerminate:=True;
Inherited Create(False);
End;
procedure TMyThread.Execute;
Var
SI:TStartUpInfo;
PI:TProcessInformation;
tc:Cardinal;
Begin
ZeroMemory(@SI,SizeOf(SI));
With SI Do
Begin
cb:=SizeOf(SI);
dwFlags:=STARTF_USESHOWWINDOW;
wShowWindow:=SW_SHOWNORMAL;
End;
tc:=GetTickCount;
If Not CreateProcess(Nil,'notepad.exe',Nil,Nil,True,NORMAL_PRIORITY_CLASS,Nil,Nil,SI,PI ) Then Exit;
Repeat
Sleep(10);
until (WaitForSingleObject(PI.hProcess,100)<> WAIT_TIMEOUT);
MessageBox(0,PChar(IntToStr(GetTickCount-tc)),'notepad.exe',MB_OK);
CloseHandle(PI.hProcess);
CloseHandle(PI.hThread);
End;
procedure TForm1.Button1Click(Sender: TObject);
begin
TMyThread.Create;
end;
Семеныч (2008-03-20 19:29:00) [15]> с точностью до 1 мсек.
А вот это вряд ли получится.
Семеныч (2008-03-20 19:28:00) [16]GetTickCount
CreateProcess(...., PI);
WaitForSingleObject(PI.hProcess);
GetTickCount
Но это будет полное время выполнения программы, вместе с затратами на создание и убиение ее процесса системой.
Reindeer Moss Eater (2008-03-20 19:24:00) [17]есть. только операции, а не функции.
операция вычитания.