Difference between revisions of "EpikTimer/ru"

From Lazarus wiki
Jump to navigationJump to search
 
(6 intermediate revisions by the same user not shown)
Line 27: Line 27:
 
----
 
----
  
===Project Status===
+
===Статус проекта===
* Production/Stable
+
* В производстве/Стабильный
  
 
=== Change Log ===
 
=== Change Log ===
Line 57: Line 57:
 
For any later changes, please see the Git commit log.
 
For any later changes, please see the Git commit log.
  
=== Dependencies / System Requirements ===
+
=== Зависимости/Системные требования ===
* Nanosecond resolution is supported on Intel Pentium versions with a Timestamp Counter.
+
* Разрешение Nanosecond поддерживается в версиях Intel Pentium с счетчиком Timestamp.
* Microsecond system clock is the default timebase.
+
* Микросекундные системные часы являются временной базой по умолчанию.
  
Tested on:
+
Протестировано на:
  
* Pentium IV 3,2Ghz on Windows and Linux with great precision (~ 3,220,000,000 ticks per second)
+
* Pentium IV 3,2Ghz на Windows и Linux с большой точностью (~ 3,220,000,000 тиков/сек)
* Pentium 233Mhz with Damn Small Linux. Works great with hardware clock.
+
* Pentium 233 МГц с чертовски маленьким Linux. Прекрасно работает с аппаратными часами.
* Mobile AMD 64 Athlon 3200+ on Windows XP Home (32 bit), Lazarus 9.13
+
* Mobile AMD 64 Athlon 3200+ на Windows XP Home (32 bit), Lazarus 9.13
* AMD 64 CPU, running 64 bit version of Ubuntu Linux, Lazarus 9.18.
+
* Процессор AMD 64, работающем под управлением 64-битной версии Ubuntu Linux, Lazarus 9.18.
* Intel i7-3770K, running 64-bit version of FreeBSD 9.1, using FPC 2.6.2
+
* Intel i7-3770K, работающем под управлением 64-разрядной версии FreeBSD 9.1, использует FPC 2.6.2
* ARM CPU using Raspberry Pi and FPC 2.6.2
+
* ARM CPU, использующем Raspberry Pi и FPC 2.6.2
  
=== Installation in Lazarus IDE ===
+
=== Установка в Lazarus IDE ===
* In Components/Open Package File, open etpackage.lpk
+
* В Components/Open Package File, откройте etpackage.lpk
* Compile the package and close the package dialog
+
* Скомпилируйте пакет и закройте окно диалога пакета
* In Components -> Open Package File, open the etpackage_dsgn.lpk
+
* В Components -> Open Package File, откройте etpackage_dsgn.lpk
* Compile the package.
+
* Скомпилируйте пакет.
* Click the Install button and let Lazarus rebuild
+
* Нажмите кнопку "Install" и пересоберите Lazarus
* Component will be in the System Palette (stopwatch-ruler icon)
+
* Компонент появится в системной палитре (значок секундомера-линейки)
  
=== 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'''
+
'''Когда таймер называется ET'''
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
 
uses epiktimer;
 
uses epiktimer;
Line 95: Line 95:
 
procedure InstrumentedCall;
 
procedure InstrumentedCall;
 
Begin
 
Begin
   ET.Clear; // optional... timer is cleared at creation
+
   ET.Clear; // необязательно ... таймер очищается при создании
 
   ET.Start;
 
   ET.Start;
 
   ExecuteFirstTimedSection;
 
   ExecuteFirstTimedSection;
   ET.Stop; // the timer is actually paused and can be restarted later
+
   ET.Stop; // таймер фактически приостановлен и может быть перезапущен позже
   TimedSection1:=ET.Elapsed; // store the elapsed in a global
+
   TimedSection1:=ET.Elapsed; // запоминаем прошедшее время вообще
   MakeAnUntimedOverheadCall; // not counted in the timer
+
   MakeAnUntimedOverheadCall; // не учитывается в таймере
   ET.Start; //resume the timer... continue accumulating ticks
+
   ET.Start; //возобновляем таймер ... продолжаем накапливать тики
 
   CallTimedSection2;
 
   CallTimedSection2;
   TimedSection2:=ET.Elapsed; //timer keeps running... we've just sample it.
+
   TimedSection2:=ET.Elapsed; //таймер продолжает работать ... мы просто сэмплируем его (т.е. формируем репрезентатитвную выборку).
 
   CallTimedSection3;
 
   CallTimedSection3;
 
   CallSomethingElse;
 
   CallSomethingElse;
   TimedSection3:=ET.Elapsed; //keep counting... tap the elapsed
+
   TimedSection3:=ET.Elapsed; //продолжаем считать ... фиксируем прошедшее время
 
   CallTimedSection4;
 
   CallTimedSection4;
   TimedSection4:=ET.Elapsed; //keep counting... tap the elapsed
+
   TimedSection4:=ET.Elapsed; //продолжаем считать ... фиксируем прошедшее время
   ET.clear // done... timer is stopped and zeroed
+
   ET.clear // готово ... таймер остановлен и обнулен
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
  
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:
+
Вы также можете создать любое количество таймеров из одного компонента в форме, объявив запись TimerData и передав ее в качестве параметра для запуска, остановки, истечения и очистки с использованием перегруженных методов в компоненте. Примером может быть:
  
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
Line 119: Line 119:
 
   DiskAccessTime:TimerData;
 
   DiskAccessTime:TimerData;
 
Begin
 
Begin
   ET.Clear(DiskAccessTimer); // Declared timers *must* be cleared before use.  
+
   ET.Clear(DiskAccessTimer); // Объявленные таймеры *должны* быть очищены перед использованием.  
 
   ET.Start(DiskAccessTimer);
 
   ET.Start(DiskAccessTimer);
 
   ExecuteTheTimedSection;
 
   ExecuteTheTimedSection;
   Result:=ET.Elapsed(DiskAccessTimer); // the timer keeps running...
+
   Result:=ET.Elapsed(DiskAccessTimer); // таймер продолжает работать ...
   etc...</syntaxhighlight>
+
   и т.д. ...</syntaxhighlight>
  
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.
+
Одним из конкретных применений EpikTimer является проверка того, прошло ли заданное количество времени, прежде чем продолжить выполнение задачи или выполнить другую итерацию той же задачи.
  
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
DelayInSeconds := 8.5; // or any value
+
DelayInSeconds := 8.5; // или любое значение
 
OldTime := ET.Elapsed;
 
OldTime := ET.Elapsed;
  
Line 136: Line 136:
 
end;
 
end;
  
// DelayInSeconds has elapsed and now you can continue executing the code</syntaxhighlight>
+
// DelayInSeconds истек, и теперь вы можете продолжить выполнение кода</syntaxhighlight>
  
See etdemo.pas for additional examples of component usage
+
Смотрите etdemo.pas для дополнительных примеров использования компонентов
  
==== EpikTimer as a profiler ====
+
==== EpikTimer в качестве профайлера ====
  
EpikTimer can be used to profile the speed of procedures:
+
EpikTimer может быть использован для профилирования скорости процедур:
  
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
Line 163: Line 163:
 
begin
 
begin
 
   inherited Create(AOwner);
 
   inherited Create(AOwner);
 
 
   ...
 
   ...
 
 
   {$ifdef CARDROOM_PROFILING}
 
   {$ifdef CARDROOM_PROFILING}
 
   profiler := TEpikTimer.Create(Self)
 
   profiler := TEpikTimer.Create(Self)
Line 184: Line 182:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== The ETDemo Application ===
+
=== Приложение ETDemo ===
The ETDemo application does not require EpikTimer to be installed in order
+
Приложение ETDemo не требует установки EpikTimer для компиляции и работы. Мне никогда не нравилось устанавливать палитру, полную компонентов, только для того, чтобы узнать, что мне не понравился ни один из них! :)
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'''
 
* Open etdemo.lpi
 
* compile
 
* run
 
  
=== 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:
+
* Окройте etdemo.lpi
 +
* Скомпилируйте
 +
* Запустите
  
 +
=== Консольное приложение ===
 +
Если у вас нет экземпляра объекта «Приложение», описанного выше, просто создайте экземпляр EpikTimer следующим образом. Он должен быть освобожден вручную, когда в нем отпадет нужда:
 +
<syntaxhighlight lang=pascal>
 
   ET := TEpikTimer.Create(nil)
 
   ET := TEpikTimer.Create(nil)
   ... your code here ...
+
   ... здесь ваш код ...
 
   ET.Free;
 
   ET.Free;
 +
</syntaxhighlight>
  
=== See also ===
+
=== См. также ===
 
* [[doc:fcl/fptimer/index.html|FPTimer included with FPC/Lazarus]]
 
* [[doc:fcl/fptimer/index.html|FPTimer included with FPC/Lazarus]]
 
* [[Yet another Running Timer]]
 
* [[Yet another Running Timer]]

Latest revision as of 22:41, 23 September 2019

Deutsch (de) English (en) français (fr) русский (ru)

О компоненте

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

  • Initially written on 24-06-2003 TL
  • Pre-release 30-06-2003 TL - Needs testing on the BSD's and Win32
  • Version 0.1 1-7-2003 TL
  1. initial beta release
  • Version 0.2 3-7-2003 TL
  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.
  • Version 0.3 15-11-2005
  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
  • Version 1.0 06-10-2006
  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.

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

  • Разрешение Nanosecond поддерживается в версиях Intel Pentium с счетчиком Timestamp.
  • Микросекундные системные часы являются временной базой по умолчанию.

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

  • Pentium IV 3,2Ghz на Windows и Linux с большой точностью (~ 3,220,000,000 тиков/сек)
  • Pentium 233 МГц с чертовски маленьким Linux. Прекрасно работает с аппаратными часами.
  • Mobile AMD 64 Athlon 3200+ на Windows XP Home (32 bit), Lazarus 9.13
  • Процессор AMD 64, работающем под управлением 64-битной версии Ubuntu Linux, Lazarus 9.18.
  • Intel i7-3770K, работающем под управлением 64-разрядной версии FreeBSD 9.1, использует FPC 2.6.2
  • ARM CPU, использующем Raspberry Pi и FPC 2.6.2

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

  • В Components/Open Package File, откройте etpackage.lpk
  • Скомпилируйте пакет и закройте окно диалога пакета
  • В Components -> Open Package File, откройте etpackage_dsgn.lpk
  • Скомпилируйте пакет.
  • Нажмите кнопку "Install" и пересоберите Lazarus
  • Компонент появится в системной палитре (значок секундомера-линейки)

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

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

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

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 и передав ее в качестве параметра для запуска, остановки, истечения и очистки с использованием перегруженных методов в компоненте. Примером может быть:

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

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

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

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

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

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

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

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

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 для компиляции и работы. Мне никогда не нравилось устанавливать палитру, полную компонентов, только для того, чтобы узнать, что мне не понравился ни один из них! :)

Установка

  • Окройте etdemo.lpi
  • Скомпилируйте
  • Запустите

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

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

  ET := TEpikTimer.Create(nil)
  ... здесь ваш код ...
  ET.Free;

См. также