Difference between revisions of "EpikTimer/ru"
(Created page with "{{EpikTimer}} === 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...") |
|||
(10 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
{{EpikTimer}} | {{EpikTimer}} | ||
− | === | + | === О компоненте === |
− | EpikTimer | + | EpikTimer - это секундомер для программиста, способный измерять очень короткие события с чрезвычайно высокой точностью в течение длительных периодов времени. Он прост в использовании, практически не потребляет ЦП и требует только 25 B оперативной памяти для реализации экземпляра таймера. Компонент предоставляет один внутренний таймер ... но неограниченное число может быть объявлен извне и связан с одним компонентом EpikTimer на форме. |
− | + | Загруженный архив содержит компонент, установочный пакет и демонстрационное приложение, которое иллюстрирует функции компонента, а также некоторые инструменты для оценки источников синхронизации в данной системе. | |
− | + | Этот компонент был разработан для кроссплатформенных приложений и был написан специально для Lazarus IDE и Free Pascal Compiler, и включает в себя демонстрационное приложение. | |
− | === | + | === Автор === |
− | [[User:VlxAdmin|Tom Lisjac]] | + | [[User:VlxAdmin|Tom Lisjac]] |
− | === | + | === Лицензия === |
− | [http://www.opensource.org/licenses/lgpl-license.php LGPL] ( | + | [http://www.opensource.org/licenses/lgpl-license.php LGPL](пожалуйста, свяжитесь с автором, если LGPL не совместима с лицензированием вашего проекта) |
− | + | ||
− | === | + | === Загрузка === |
− | + | '''Исходный код''' можно загрузить из Git-репозитория следующим образом: | |
git clone https://github.com/graemeg/epiktimer.git | git clone https://github.com/graemeg/epiktimer.git | ||
− | + | Если вы не хотите устанавливать Git-клиент, Github также позволяет загружать последний код в виде ZIP-архива. Просто перейдите по ссылке [https://github.com/graemeg/epiktimer Github EpikTimer] и нажмите кнопку «Загрузить ZIP» справа. | |
− | + | Все '''tagged releases''' (помеченные выпуски) можно скачать в формате .zip или .tar.gz, перейдя по этой ссылке [https://github.com/graemeg/epiktimer/releases Github Releases] и выбрав zip или tar.gz ссылка для любого релиза, который вы хотите скачать. | |
− | === | + | ---- |
− | * | + | [[User:Zoltanleo|Прим.перев.]]: Боюсь ошибиться, но в релизах Лазаруса после v.2.0.0 точно, EpikTimer можно скачать и установить посредством '''O'''nline '''P'''ackage '''M'''anager. |
+ | ---- | ||
+ | |||
+ | ===Статус проекта=== | ||
+ | * В производстве/Стабильный | ||
=== Change Log === | === Change Log === | ||
Line 53: | Line 57: | ||
For any later changes, please see the Git commit log. | For any later changes, please see the Git commit log. | ||
− | === | + | === Зависимости/Системные требования === |
− | * Nanosecond | + | * Разрешение Nanosecond поддерживается в версиях Intel Pentium с счетчиком Timestamp. |
− | * | + | * Микросекундные системные часы являются временной базой по умолчанию. |
− | + | Протестировано на: | |
− | * Pentium IV 3,2Ghz | + | * Pentium IV 3,2Ghz на Windows и Linux с большой точностью (~ 3,220,000,000 тиков/сек) |
− | * Pentium | + | * Pentium 233 МГц с чертовски маленьким Linux. Прекрасно работает с аппаратными часами. |
− | * Mobile AMD 64 Athlon 3200+ | + | * Mobile AMD 64 Athlon 3200+ на Windows XP Home (32 bit), Lazarus 9.13 |
− | * AMD 64 | + | * Процессор AMD 64, работающем под управлением 64-битной версии Ubuntu Linux, Lazarus 9.18. |
− | * Intel i7-3770K, | + | * Intel i7-3770K, работающем под управлением 64-разрядной версии FreeBSD 9.1, использует FPC 2.6.2 |
− | * ARM CPU | + | * 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''' |
<syntaxhighlight lang="pascal"> | <syntaxhighlight lang="pascal"> | ||
uses epiktimer; | uses epiktimer; | ||
Line 91: | Line 95: | ||
procedure InstrumentedCall; | procedure InstrumentedCall; | ||
Begin | Begin | ||
− | ET.Clear; // | + | ET.Clear; // необязательно ... таймер очищается при создании |
ET.Start; | ET.Start; | ||
ExecuteFirstTimedSection; | ExecuteFirstTimedSection; | ||
− | ET.Stop; // | + | ET.Stop; // таймер фактически приостановлен и может быть перезапущен позже |
− | TimedSection1:=ET.Elapsed; // | + | TimedSection1:=ET.Elapsed; // запоминаем прошедшее время вообще |
− | MakeAnUntimedOverheadCall; // | + | MakeAnUntimedOverheadCall; // не учитывается в таймере |
− | ET.Start; // | + | ET.Start; //возобновляем таймер ... продолжаем накапливать тики |
CallTimedSection2; | CallTimedSection2; | ||
− | TimedSection2:=ET.Elapsed; // | + | TimedSection2:=ET.Elapsed; //таймер продолжает работать ... мы просто сэмплируем его (т.е. формируем репрезентатитвную выборку). |
CallTimedSection3; | CallTimedSection3; | ||
CallSomethingElse; | CallSomethingElse; | ||
− | TimedSection3:=ET.Elapsed; // | + | TimedSection3:=ET.Elapsed; //продолжаем считать ... фиксируем прошедшее время |
CallTimedSection4; | CallTimedSection4; | ||
− | TimedSection4:=ET.Elapsed; // | + | TimedSection4:=ET.Elapsed; //продолжаем считать ... фиксируем прошедшее время |
− | ET.clear // | + | ET.clear // готово ... таймер остановлен и обнулен |
end;</syntaxhighlight> | end;</syntaxhighlight> | ||
− | + | Вы также можете создать любое количество таймеров из одного компонента в форме, объявив запись TimerData и передав ее в качестве параметра для запуска, остановки, истечения и очистки с использованием перегруженных методов в компоненте. Примером может быть: | |
<syntaxhighlight lang="pascal"> | <syntaxhighlight lang="pascal"> | ||
Line 115: | Line 119: | ||
DiskAccessTime:TimerData; | DiskAccessTime:TimerData; | ||
Begin | Begin | ||
− | ET.Clear(DiskAccessTimer); // | + | ET.Clear(DiskAccessTimer); // Объявленные таймеры *должны* быть очищены перед использованием. |
ET.Start(DiskAccessTimer); | ET.Start(DiskAccessTimer); | ||
ExecuteTheTimedSection; | ExecuteTheTimedSection; | ||
− | Result:=ET.Elapsed(DiskAccessTimer); // | + | Result:=ET.Elapsed(DiskAccessTimer); // таймер продолжает работать ... |
− | + | и т.д. ...</syntaxhighlight> | |
− | + | Одним из конкретных применений EpikTimer является проверка того, прошло ли заданное количество времени, прежде чем продолжить выполнение задачи или выполнить другую итерацию той же задачи. | |
<syntaxhighlight lang="pascal"> | <syntaxhighlight lang="pascal"> | ||
− | DelayInSeconds := 8.5; // | + | DelayInSeconds := 8.5; // или любое значение |
OldTime := ET.Elapsed; | OldTime := ET.Elapsed; | ||
Line 132: | Line 136: | ||
end; | end; | ||
− | // DelayInSeconds | + | // DelayInSeconds истек, и теперь вы можете продолжить выполнение кода</syntaxhighlight> |
− | + | Смотрите etdemo.pas для дополнительных примеров использования компонентов | |
− | ==== EpikTimer | + | ==== EpikTimer в качестве профайлера ==== |
− | EpikTimer | + | EpikTimer может быть использован для профилирования скорости процедур: |
<syntaxhighlight lang="pascal"> | <syntaxhighlight lang="pascal"> | ||
Line 159: | 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 180: | Line 182: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | === | + | === Приложение ETDemo === |
− | + | Приложение ETDemo не требует установки EpikTimer для компиляции и работы. Мне никогда не нравилось устанавливать палитру, полную компонентов, только для того, чтобы узнать, что мне не понравился ни один из них! :) | |
− | |||
− | |||
− | ''' | + | '''Установка''' |
− | * | + | * Окройте etdemo.lpi |
− | * | + | * Скомпилируйте |
− | * | + | * Запустите |
− | |||
− | |||
− | |||
+ | === Консольное приложение === | ||
+ | Если у вас нет экземпляра объекта «Приложение», описанного выше, просто создайте экземпляр EpikTimer следующим образом. Он должен быть освобожден вручную, когда в нем отпадет нужда: | ||
+ | <syntaxhighlight lang=pascal> | ||
ET := TEpikTimer.Create(nil) | ET := TEpikTimer.Create(nil) | ||
− | ... | + | ... здесь ваш код ... |
ET.Free; | ET.Free; | ||
+ | </syntaxhighlight> | ||
− | === | + | === См. также === |
* [[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, и включает в себя демонстрационное приложение.
Автор
Лицензия
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
- initial beta release
- Version 0.2 3-7-2003 TL
- Revised logic around hardware detection to prevent executing extended instructions if the HasCapabilityData call returns false.
- Removed exposed low level diagnositic functions from unit interface.
- Revised demo.
- Version 0.3 15-11-2005
- Updated 0.2 version to make it compile on the latest Lazarus (0.9.10).
- Added LCL to the required packages.
- Changed mode to Delphi in order to compile.
- Changed windows timebase to use QueryPerformanceCounter, because has a much greater precision then GetSystemTime.
- Added changes to ensure the component compiles on Delphi 7.0
- Made tests on Windows and Linux
- Small changes to the demo to make it compile
- Version 1.0 06-10-2006
- Changes for 64 bits operation
- Added units BaseUnix, Unix and UnixUtil, removed oldlinux (obsolete)
- Gettimeofday -> fpGettimeofday
- Changed systemsleep for 64 bits systems
- Some changes in timeval
- 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;