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

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

Время выполнения процедуры [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;


Наверх

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