Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.51 MB
Время: 0.019 c
15-1204184827
Riply
2008-02-28 10:47
2008.04.13
RAD Studio "неправильные ошибки".


6-1185174069
andreil
2007-07-23 11:01
2008.04.13
Плагин для IE на Delphi?


2-1205934346
Kolan
2008-03-19 16:45
2008.04.13
Преобразовать структуру в массив байт и наоборот.


15-1204184372
Kerk
2008-02-28 10:39
2008.04.13
Прекрасное далёко...


2-1205499225
Washington
2008-03-14 15:53
2008.04.13
SendMessage