Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 313

Раздел: Delphi » Прочее
/ вопрос открыт /

Приветствую, уважаемые эксперты!
Подскажите, пожалуйста, какие в делфи есть процедуры для определения времени выполнения операций? и можно ли с точностью до микросекунд считать?

а то у меня сортирует массив из 10000 элементов за 20 млс и не знаю как мне график зависимости скорости от кол-ва эл. построить, потому что он просто 0 мин 0 с 0 млс пишет, если элементов меньше 5 тысяч

NeStor Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: NeStor (статус: Посетитель)
Вопрос отправлен: 24 мая 2011, 19:13
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Вот исходник таймера. Как говорится, отдаю "as is", юзай на свой страх и риск.

{
HRT := THRTimer.Create;
HRT.StartTimer;  Сброс таймера в ноль
HRT.ReadTimer;   Возвращает отсчитанное время в миллисекундах
начиная со времени старта
}
 
unit HRTimer;
 
interface
 
uses Windows;
 
type
  // --------------------- Класс - высокоточный таймер -------------------------
  THRTimer = class(TObject)
    constructor Create;
    function StartTimer: Boolean; // Обнуление таймера
    function ReadTimer: Double;   // Чтение значения таймера в миллисекундах
  private
    StartTime: Double;
    ClockRate: Double;
  public
    Exists: Boolean;    // Флаг успешного создания таймера
  end;
 
var
  Timer: THRTimer; // Глобальая переменная. Создаётся при запуске программы
 
{ Фукнция высокоточной задержки.
 Delphi:
   Синтаксис: function HRDelay(const Milliseconds: Double): Double;
   Milliseconds: Double - задержка в миллисекундах (может быть дробной)
   Результат функции - фактически произошедшая задержка с погрешностью.
   Пример вызова функции: X:= HRDelay(100.0); или HRDelay(100.0);
 
 C++Builder:
   Синтаксис: double HRDelay(const double Milliseconds);
   Double Milliseconds - задержка в миллисекундах (может быть дробной)
   Результат функции - фактически произошедшая задержка с погрешностью.
   Пример вызова функции: double X = HRDelay(100.0); или HRDelay(100.0);}
function HRDelay(const Milliseconds: Double): Double;
 
implementation
 
function HRDelay(const Milliseconds: Double): Double;
begin
  Timer.StartTimer();
  repeat
    Result:= Timer.ReadTimer();
  until Result >= Milliseconds;
end;
 
{ THRTimer }
 
constructor THRTimer.Create;
var
  QW: LARGE_INTEGER;
begin
  inherited Create;
  Exists := QueryPerformanceFrequency(Int64(QW));
  ClockRate := QW.QuadPart;
end;
 
function THRTimer.StartTimer: Boolean;
var
  QW: LARGE_INTEGER;
begin
  Result := QueryPerformanceCounter(Int64(QW));
  StartTime := QW.QuadPart;
end;
 
function THRTimer.ReadTimer: Double;
var
  ET: LARGE_INTEGER;
begin
  QueryPerformanceCounter(Int64(ET));
  Result := 1000.0 * (ET.QuadPart - StartTime) / ClockRate;
end;
 
initialization
  Timer:= THRTimer.Create();
 
finalization
  Timer.Free();
 
end.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 24 мая 2011, 20:06
Оценка за ответ: 5

Комментарий к оценке: спасибо

Мини-форум вопроса

Всего сообщений: 8; последнее сообщение — 24 мая 2011, 20:17; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 24 мая 2011, 19:32 [#1]:

Цитата (NeStor):

и можно ли с точностью до микросекунд считать?

Нельзя. Windows - это многозадачная система. Отсчитанное время будет временем выполнения всех активных процессов на отрезке от начала замера до его конца.

Цитата (NeStor):

а то у меня сортирует массив из 10000 элементов за 20 млс и не знаю как мне график зависимости скорости от кол-ва эл. построить, потому что он просто 0 мин 0 с 0 млс пишет, если элементов меньше 5 тысяч

А это смотря как ты измеряешь. GetTickCount()? Могу дать хатрый таймер на основе тактовой частоты процессора. Только хрен его знает, как он будет работать на процессорах с переменной частотой. И даже если этот таймер работает правильно, время всё равно будет относительным и зависеть от запущенных процессов и других факторов.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
NeStor

NeStor (статус: Посетитель), 24 мая 2011, 19:54 [#2]:

хитрый таймер? это что за таймер такой-то?
bugmenot

bugmenot (статус: 3-ий класс), 24 мая 2011, 19:57 [#3]:

в дельфях ничего нет, в винде есть - http://msdn.microsoft.com/en-us/library/ms644904(VS.85).aspx
еще в процессорах 80586 и выше есть инструкция RDTSC, но ныне (на современных камнях) её использовании считается неверным (детали - в MSDN)
виконання програми розпочинається з того самого мiсця, де призупинилося.

min@y™

min@y™ (статус: Доктор наук), 24 мая 2011, 19:57 [#4]:

Цитата (NeStor):

хитрый таймер? это что за таймер такой-то?

Могу дать исходник. Он маленький совсем. Но я им пользуюсь давно. Нареканий пока нет.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
NeStor

NeStor (статус: Посетитель), 24 мая 2011, 20:01 [#5]:

нам препод DecodeTime вроде давал. мне бы и он пошел, если б можно было еще точнее время засечь. так что за исходник?
min@y™

min@y™ (статус: Доктор наук), 24 мая 2011, 20:05 [#6]:

Цитата (NeStor):

нам препод DecodeTime вроде давал. мне бы и он пошел, если б можно было еще точнее время засечь.

DecodeTime время не засекает, а декодирует TDateTime в часы, минуты, секунды и миллисекунды. Это не имеет никакого отношения к измерению времени.

Цитата (NeStor):

так что за исходник?

Щас поищу.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
bugmenot

bugmenot (статус: 3-ий класс), 24 мая 2011, 20:15 [#7]:

фигли тут искать
function RDTSC(): Int64;
asm
    RDTSC
end;
все замечания выше остаются в силе
виконання програми розпочинається з того самого мiсця, де призупинилося.

NeStor

NeStor (статус: Посетитель), 24 мая 2011, 20:17 [#8]:

ок. попробую всё)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 16:46
Выполнено за 0.03 сек.