Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.04.13;
Скачать: [xml.tar.bz2];

Вниз

Как засечь время выполнения другой программы?   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
2-1205758991
savyhinst
2008-03-17 16:03
2008.04.13
Повернуть картинку


15-1204206966
boriskb
2008-02-28 16:56
2008.04.13
Премьера «Кин-дза-дза» состоится в 2010 году


15-1204114557
Джо
2008-02-27 15:15
2008.04.13
Посоветуйте хостинг в Украине


2-1205655917
NewSer
2008-03-16 11:25
2008.04.13
Как проверить уникальность вводимого в ключевое поле значения?


2-1205652230
NewSer
2008-03-16 10:23
2008.04.13
В чём причина появления ошибки: «parameter Kod not found»?(ADO)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский