![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Время выполнения процедуры [D7, D2005, XP]
Std © (2006-05-26 23:17:00)Уважаемые мастера, подскажите как зделать таймер который бы щитал время выполнения процедуры, и выводил это время то тысячный(но лучшедо десятитысячных) секунды.
типа при нажатии кнопки выполняется чтото типа starttimer() в конце делается stoptime() и в какой то переменной было время выполения процедуры в СЕКУНДАХ
Rial (2006-05-27 01:09:00) [1]Кстати, с неверным укруглением тоже может быть связано.
Посмотри вот это на досуге:
function GetCpuSpeed(Const CPUTestTime:Integer):Extended;
Var TimerHi,TimerLo:DWord;
PriorityClass,Priority:Integer;
Process,Thread:THandle;
begin
Process:=GetCurrentProcess;
Thread:=GetCurrentThread;
PriorityClass:=GetPriorityClass(Process);
Priority:=GetThreadPriority(Thread);
SetPriorityClass(Process,REALTIME_PRIORITY_CLASS);
SetThreadPriority(Thread,THREAD_PRIORITY_TIME_CRITICAL);
Sleep(50);
Asm
DW 310Fh
Mov TimerLo,EAx
Mov TimerHi,EDx
End;
Sleep(CPUTestTime);
Asm
DW 310Fh
Sub EAx,TimerLo
Sbb EDx,TimerHi
Mov TimerLo,EAx
Mov TimerHi,EDx
end;
SetThreadPriority(Thread,Priority);
SetPriorityClass(Process,PriorityClass);
GetCpuSpeed:=TimerLo/(MHzMulti*CPUTestTime);
end;
Джо (2006-05-27 00:28:00) [2]> выводит 4,9994 а по идее ж должен 5 вывести. сч ем это связано?
С тем, что Windows не real-time ОС. С тем, что мерять "десятитысячные" доли секунды это, собственно, абсурдно. Много с чем связано.
Std (2006-05-27 00:26:00) [3]мда, пратупил, извиняюсь
кстати вопрос уже немного не по теме
Counter := CreateCounter;
Sleep(5000);
ShowMessageFmt ('%.4f',[Counter.Elapsed])
выводит 4,9994 а по идее ж должен 5 вывести. сч ем это связано?
Джо (2006-05-27 00:19:00) [4]> и всеравно пишет туже хрень :)
Ты ведь и сделал "ту же хрень".Typeкто писать будет, а?
Std (2006-05-27 00:18:00) [5]вот зделал модуль
unit Unit2;
interface
uses Windows;
ICounter = interface
['{D286E702-ED7E-45D1-8748-4F1D043ACEA6}']
procedure Start;
function Elapsed: Double;
end;
function CreateCounter: ICounter;
implementation
type
TCounter = class (TInterfacedObject, ICounter)
private
FFreq,
FTime1: Int64;
public
procedure Start;
function Elapsed: Double;
constructor Create;
end;
function CreateCounter: ICounter;
begin
Result := TCounter.Create
end;
constructor TCounter.Create;
begin
if not QueryPerformanceFrequency (FFreq) then
raise Exception.Create('Таймер аппаратно не поддерживается');
Start
end;
function TCounter.Elapsed: Double;
var
FTime2: Int64;
begin
QueryPerformanceCounter (FTime2);
Result := (FTime2-FTime1)/FFreq
end;
procedure TCounter.Start;
begin
QueryPerformanceCounter (FTime1);
end;
end.
и всеравно пишет туже хрень :)
Джо (2006-05-27 00:06:00) [6]> куда б его не всунул все время эту хрень пишет
Его не нужно никуда засовывать.:) Это объявление типа-интерфейса. Соответственно, перед ним нужно написатьtype.
Рекоммендую все это дело оформить отдельным юнитом.
Std (2006-05-27 00:02:00) [7]а куда сунуть
ICounter = interface
['{D286E702-ED7E-45D1-8748-4F1D043ACEA6}']
procedure Start;
function Elapsed: Double;
end;
а то на нем постоянно выскакивает [Pascal Error] Unit2.pas(12): E2029 'IMPLEMENTATION' expected but ';' found
куда б его не всунул все время эту хрень пишет
З.Ы. первый вариант без поблем работает :)
Std (2006-05-26 23:51:00) [8]огромное спасибо
Джо (2006-05-26 23:46:00) [9]Не, так лучше буить :)
ICounter = interface
['{D286E702-ED7E-45D1-8748-4F1D043ACEA6}']
procedure Start;
function Elapsed: Double;
end;
function CreateCounter: ICounter;
implementation
type
TCounter = class (TInterfacedObject, ICounter)
private
FFreq,
FTime1: Int64;
public
procedure Start;
function Elapsed: Double;
constructor Create;
end;
function CreateCounter: ICounter;
begin
Result := TCounter.Create
end;
constructor TCounter.Create;
begin
if not QueryPerformanceFrequency (FFreq) then
raise Exception.Create('Таймер аппаратно не поддерживается');
Start
end;
function TCounter.Elapsed: Double;
var
FTime2: Int64;
begin
QueryPerformanceCounter (FTime2);
Result := (FTime2-FTime1)/FFreq
end;
procedure TCounter.Start;
begin
QueryPerformanceCounter (FTime1);
end;
end.
Используем:
procedure TForm23.Button1Click(Sender: TObject);
var
Counter: ICounter;
begin
Counter := CreateCounter;
//
Sleep(1000);
//
ShowMessageFmt ('%.4f',[Counter.Elapsed])
end;
Джо (2006-05-26 23:35:00) [10]забыл, в секции implementation объяви
var
Freq: Int64;
Джо (2006-05-26 23:34:00) [11]
function StartTimer(var Time1: Int64): Boolean;
begin
Result := QueryPerformanceFrequency (Freq) ;
QueryPerformanceCounter (Time1);
end;
function MeasureTimer (Time1: Int64): Extended;
var
Time2: Int64;
begin
QueryPerformanceCounter(Time2);
Result := (Time2-Time1)/Freq
end;
procedure TForm23.Button1Click(Sender: TObject);
var
ATime: Int64;
ElapsedSec: Extended;
begin
StartTimer(ATime);
//
Sleep (1000);
//
ElapsedSec := MeasureTimer(ATime);
ShowMessageFmt ('Прошло: %.4f',[ElapsedSec])
end;