Текущий архив: 2008.04.13;
Скачать: CL | DM;
Вниз
Как засечь время выполнения другой программы? Найти похожие ветки
← →
sashap (2008-03-20 19:23) [0]Нужно засечь время выполнения другой программы с точностью до 1 мсек.
Как это лучше всего сделать? Определить разницу во времени до и после запуска другой программы? Может, в Делфи есть уже готовые функции?
Спасибо за внимание!
← →
Reindeer Moss Eater © (2008-03-20 19:24) [1]есть. только операции, а не функции.
операция вычитания.
← →
Семеныч (2008-03-20 19:28) [2]GetTickCount
CreateProcess(...., PI);
WaitForSingleObject(PI.hProcess);
GetTickCount
Но это будет полное время выполнения программы, вместе с затратами на создание и убиение ее процесса системой.
← →
Семеныч (2008-03-20 19:29) [3]> с точностью до 1 мсек.
А вот это вряд ли получится.
← →
Palladin © (2008-03-20 19:35) [4]
> Может, в Делфи есть уже готовые функции?
а еще она кофе подносить умеет и мух отгонять... а что она вытворяет с комарами... ууу....
создаем отдельный поточек, который запускает процессик таким образом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;
← →
Palladin © (2008-03-20 19:36) [5]
> с точностью до 1 мсек.
до 100 может и получится, учитывая еще и Семеныч (20.03.08 19:28) [2] второй абзац, то даже я бы сказал и до 200, и вообще... куча факторов зависимости...
← →
Семеныч (2008-03-20 19:46) [6]Возможно, точность повысится, если и своей, и запускаемой программе поставить Real-Time приоритет.
← →
Palladin © (2008-03-20 19:48) [7]издеваешься? :) да аффтара линчуют за такие дела! :))
← →
Семеныч (2008-03-20 19:48) [8]Зачем цикл ожидания? Просто WaitForSingleObject(PI.hProcess, INFINITE)
← →
Семеныч (2008-03-20 19:50) [9]> Palladin © (20.03.08 19:48) [7]
Если недолгий одноразовый эксперимент, то ничего страшного.
Если нет, то не Real-Time, но все равно повышенный.
← →
Семеныч (2008-03-20 19:50) [10]Кстати, если недолгий одноразовый эксперимент, то и второй поток не нужен.
← →
Palladin © (2008-03-20 19:51) [11]что бы вставить в него проверку Terminate котору я вставить забыл :)
← →
Leonid Troyanovsky © (2008-03-20 19:53) [12]
> Семеныч (20.03.08 19:29) [3]
> > с точностью до 1 мсек.
> А вот это вряд ли получится.
GetProcessTimes
--
Regards, LVT.
← →
ЦУП © (2008-03-20 19:53) [13]Если нужно посчитать, какое время приложение РЕАЛЬНО работает, то GetProcessTimes. Тогда точности хватит с лихвой.
← →
sashap (2008-03-20 20:10) [14]Семеныч, 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 20:14) [15]
> Точность мне нужна, чтобы сравнить два схожих алгоритма
> на одном компе.
Как раз ошибочно засекаешь время. таким образом не сравнишь реальное время работы твоего алгоритма. Учти, что во время выполнения твоего приложения происходит постоянное переключение потоков и приложений.
Для точного вычисления времени воспользуйся GetProcessTimes/GetThreadTimes. Так тебе удастся вычислить точно, сколько процессорного времени заняло выполнение твоего алгоритма.
← →
Семеныч (2008-03-20 20:19) [16]> 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:22) [17]> sashap (20.03.08 20:10) [14]
И если Вам действительно нужна точность, то очень советую серьезно подумать над [15]. Потому что реальное время работы одной программы (а не всей системы со всей кучей программ в ней) дает как раз GetProcessTimes.
Страницы: 1 вся ветка
Текущий архив: 2008.04.13;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.006 c