Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как засечь время выполнения другой программы? [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]

есть. только операции, а не функции.
операция вычитания.


Наверх

Титульная страница Поиск, карта сайта Написать письмо