Sign in Join
Wiki copytemporary

EpikTimer

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

About

EpikTimer is a programmer's stopwatch that is capable of measuring very short events with traceably high precision over long periods of time. It's simple to use, consumes virtually no CPU and requires only 25 bytes of ram to implement a timer instance. The component provides a single internal timer... but unlimited numbers can be declared externally and linked to a single EpikTimer component on the form.

The download contains the component, an installation package and a demo application, that illustrates the features of the component along with some instrumentation for evaluating the clock sources on a given system.

This component was designed for cross-platform applications and was written specifically for the Lazarus IDE and Free Pascal Compiler and includes a demo application.

Author

Tom Lisjac

License

LGPL (please contact the author if the LGPL doesn't work with your project licensing)

Download

The source code can be downloaded from the Git repository as follows:

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

If you don't want to install a Git client, Github also allows you to download the latest code as a ZIP archive. Simply go to the Github EpikTimer url and click the "Download ZIP" button on the right.

All tagged releases can be downloaded in .zip or .tar.gz format by going to this Github Releases url and select the zip or tar.gz link for whichever release you want to download.

Project Status

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.

Dependencies / System Requirements

Tested on:

Installation in Lazarus IDE

Usage

Drop the component on a form. The component contains a single timer instance and parameterless calls to start, stop, elapsed and clear will implicitly reference it.

If the timer is named ET

pascal
uses epiktimer;

var
  ET: TEpikTimer;

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

procedure InstrumentedCall;
Begin
  ET.Clear; // optional... timer is cleared at creation
  ET.Start;
  ExecuteFirstTimedSection;
  ET.Stop; // the timer is actually paused and can be restarted later
  TimedSection1:=ET.Elapsed; // store the elapsed in a global
  MakeAnUntimedOverheadCall; // not counted in the timer
  ET.Start; //resume the timer... continue accumulating ticks
  CallTimedSection2;
  TimedSection2:=ET.Elapsed; //timer keeps running... we've just sample it.
  CallTimedSection3;
  CallSomethingElse;
  TimedSection3:=ET.Elapsed; //keep counting... tap the elapsed
  CallTimedSection4;
  TimedSection4:=ET.Elapsed; //keep counting... tap the elapsed
  ET.clear // done... timer is stopped and zeroed
end;

You can also create any number of timers from a single component on the form by declaring a TimerData record and passing it as a parameter to start, stop, elapsed and clear using the overloaded methods in the component. An example would be:

pascal
Function TimedExecution: Extended;
Var 
  DiskAccessTime:TimerData;
Begin
  ET.Clear(DiskAccessTimer); // Declared timers *must* be cleared before use. 
  ET.Start(DiskAccessTimer);
  ExecuteTheTimedSection;
  Result:=ET.Elapsed(DiskAccessTimer); // the timer keeps running...
  etc...

One particular use for EpikTimer is checking if a given amount of time has elapsed before continuing with a task or to another iteration of the same task.

pascal
DelayInSeconds := 8.5; // or any value
OldTime := ET.Elapsed;

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

// DelayInSeconds has elapsed and now you can continue executing the code

See etdemo.pas for additional examples of component usage

EpikTimer as a profiler

EpikTimer can be used to profile the speed of procedures:

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;

The ETDemo Application

The ETDemo application does not require EpikTimer to be installed in order to compile and operate. I never liked having to install a palette full of components only to find out that I didn't like any of them! :)

Installation

Console application

If you don't have an "Application" object instance as above, simply create the EpikTimer instance as follows. It must be manually freed when you are all done with it:

 ET := TEpikTimer.Create(nil)
 ... your code here ...
 ET.Free;

See also


From the Free Pascal wiki, page "EpikTimer", as it stood on 2019-08-09 after a change by Trev, 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.