Sign in Join
Wiki copytemporary

EpikTimer/ru

Deutsch · English · Français · Русский

О компоненте

EpikTimer - это секундомер для программиста, способный измерять очень короткие события с чрезвычайно высокой точностью в течение длительных периодов времени. Он прост в использовании, практически не потребляет ЦП и требует только 25 B оперативной памяти для реализации экземпляра таймера. Компонент предоставляет один внутренний таймер ... но неограниченное число может быть объявлен извне и связан с одним компонентом EpikTimer на форме.

Загруженный архив содержит компонент, установочный пакет и демонстрационное приложение, которое иллюстрирует функции компонента, а также некоторые инструменты для оценки источников синхронизации в данной системе.

Этот компонент был разработан для кроссплатформенных приложений и был написан специально для Lazarus IDE и Free Pascal Compiler, и включает в себя демонстрационное приложение.

Автор

Tom Lisjac

Лицензия

LGPL(пожалуйста, свяжитесь с автором, если LGPL не совместима с лицензированием вашего проекта)

Загрузка

Исходный код можно загрузить из Git-репозитория следующим образом:

 git clone https://github.com/graemeg/epiktimer.git

Если вы не хотите устанавливать Git-клиент, Github также позволяет загружать последний код в виде ZIP-архива. Просто перейдите по ссылке Github EpikTimer и нажмите кнопку «Загрузить ZIP» справа.

Все tagged releases (помеченные выпуски) можно скачать в формате .zip или .tar.gz, перейдя по этой ссылке Github Releases и выбрав zip или tar.gz ссылка для любого релиза, который вы хотите скачать.


Прим.перев.: Боюсь ошибиться, но в релизах Лазаруса после v.2.0.0 точно, EpikTimer можно скачать и установить посредством Online Package Manager.


Статус проекта

Change Log

  1. initial beta release
  1. Revised logic around hardware detection to prevent executing extended instructions if the HasCapabilityData call returns false.
  2. Removed exposed low level diagnositic functions from unit interface.
  3. Revised demo.
  1. Updated 0.2 version to make it compile on the latest Lazarus (0.9.10).
  2. Added LCL to the required packages.
  3. Changed mode to Delphi in order to compile.
  4. Changed windows timebase to use QueryPerformanceCounter, because has a much greater precision then GetSystemTime.
  5. Added changes to ensure the component compiles on Delphi 7.0
  6. Made tests on Windows and Linux
  7. Small changes to the demo to make it compile
  1. Changes for 64 bits operation
  2. Added units BaseUnix, Unix and UnixUtil, removed oldlinux (obsolete)
  3. Gettimeofday -> fpGettimeofday
  4. Changed systemsleep for 64 bits systems
  5. Some changes in timeval
  6. Tested on AMD64 (linux)

For any later changes, please see the Git commit log.

Зависимости/Системные требования

Протестировано на:

Установка в Lazarus IDE

Использование

Перетащите компонент на форму. Компонент содержит один экземпляр таймера, и вызовы без параметров для запуска, остановки, истечения и очистки будут неявно ссылаться на него.

Когда таймер называется ET

pascal
uses epiktimer;

var
  ET: TEpikTimer;

procedure InitTimer;
begin
  ET := TEpikTimer.Create(Application);
end;

procedure InstrumentedCall;
Begin
  ET.Clear; // необязательно ... таймер очищается при создании
  ET.Start;
  ExecuteFirstTimedSection;
  ET.Stop; // таймер фактически приостановлен и может быть перезапущен позже
  TimedSection1:=ET.Elapsed; // запоминаем прошедшее время вообще
  MakeAnUntimedOverheadCall; // не учитывается в таймере
  ET.Start; //возобновляем таймер ... продолжаем накапливать тики
  CallTimedSection2;
  TimedSection2:=ET.Elapsed; //таймер продолжает работать ... мы просто сэмплируем его (т.е. формируем репрезентатитвную выборку).
  CallTimedSection3;
  CallSomethingElse;
  TimedSection3:=ET.Elapsed; //продолжаем считать ... фиксируем прошедшее время
  CallTimedSection4;
  TimedSection4:=ET.Elapsed; //продолжаем считать ... фиксируем прошедшее время
  ET.clear // готово ... таймер остановлен и обнулен
end;

Вы также можете создать любое количество таймеров из одного компонента в форме, объявив запись TimerData и передав ее в качестве параметра для запуска, остановки, истечения и очистки с использованием перегруженных методов в компоненте. Примером может быть:

pascal
Function TimedExecution: Extended;
Var 
  DiskAccessTime:TimerData;
Begin
  ET.Clear(DiskAccessTimer); // Объявленные таймеры *должны* быть очищены перед использованием. 
  ET.Start(DiskAccessTimer);
  ExecuteTheTimedSection;
  Result:=ET.Elapsed(DiskAccessTimer); // таймер продолжает работать ...
  ?? ??.??. ...

Одним из конкретных применений EpikTimer является проверка того, прошло ли заданное количество времени, прежде чем продолжить выполнение задачи или выполнить другую итерацию той же задачи.

pascal
DelayInSeconds := 8.5; // или любое значение
OldTime := ET.Elapsed;

while ((ET.Elapsed - OldTime) < DelayInSeconds) do
begin
  ET.SystemSleep(10);
end;

// DelayInSeconds истек, и теперь вы можете продолжить выполнение кода

Смотрите etdemo.pas для дополнительных примеров использования компонентов

EpikTimer в качестве профайлера

EpikTimer может быть использован для профилирования скорости процедур:

pascal
uses
  {$ifdef PROFILING}epiktimer,{$endif}
  ...

type
  TMyClass = class
  private
    {$ifdef PROFILING}
    profiler: Tepiktimer;
    {$endif}
    ...
  end;

implementation

constructor TMyClass.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ...
  {$ifdef CARDROOM_PROFILING}
  profiler := TEpikTimer.Create(Self)
  {$endif}
end;

procedure TMyClass.MethodToBeProfiled;
begin
  {$ifdef PROFILING}
  profiler.Clear;
  profiler.Start;
  {$endif}
  // do stuff
  {$ifdef PROFILING}
  OPDebugLn('TMyClass.MethodToBeProfiled ' + FloatToStr(profiler.Elapsed));
  {$endif}
end;

Приложение ETDemo

Приложение ETDemo не требует установки EpikTimer для компиляции и работы. Мне никогда не нравилось устанавливать палитру, полную компонентов, только для того, чтобы узнать, что мне не понравился ни один из них! :)

Установка

Консольное приложение

Если у вас нет экземпляра объекта «Приложение», описанного выше, просто создайте экземпляр EpikTimer следующим образом. Он должен быть освобожден вручную, когда в нем отпадет нужда:

pascal
  ET := TEpikTimer.Create(nil)
  ... ?????????? ?????? ?????? ...
  ET.Free;

См. также


From the Free Pascal wiki, page "EpikTimer/ru", as it stood on 2019-09-23 after a change by Zoltanleo, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revision 1, last changed by WikiArchive .

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.