|
Вопрос # 5 313/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Подскажите, пожалуйста, какие в делфи есть процедуры для определения времени выполнения операций? и можно ли с точностью до микросекунд считать?
а то у меня сортирует массив из 10000 элементов за 20 млс и не знаю как мне график зависимости скорости от кол-ва эл. построить, потому что он просто 0 мин 0 с 0 млс пишет, если элементов меньше 5 тысяч
 |
Вопрос задал: 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™ (статус: Доктор наук), 24 мая 2011, 19:32 [#1]:
Цитата (NeStor):
и можно ли с точностью до микросекунд считать?
Нельзя. Windows - это многозадачная система. Отсчитанное время будет временем выполнения всех активных процессов на отрезке от начала замера до его конца.
Цитата (NeStor):
а то у меня сортирует массив из 10000 элементов за 20 млс и не знаю как мне график зависимости скорости от кол-ва эл. построить, потому что он просто 0 мин 0 с 0 млс пишет, если элементов меньше 5 тысяч
А это смотря как ты измеряешь. GetTickCount()? Могу дать хатрый таймер на основе тактовой частоты процессора. Только хрен его знает, как он будет работать на процессорах с переменной частотой. И даже если этот таймер работает правильно, время всё равно будет относительным и зависеть от запущенных процессов и других факторов.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
NeStor (статус: Посетитель), 24 мая 2011, 19:54 [#2]:
хитрый таймер? это что за таймер такой-то?
|
|
bugmenot (статус: 3-ий класс), 24 мая 2011, 19:57 [#3]:
в дельфях ничего нет, в винде есть - http://msdn.microsoft.com/en-us/library/ms644904(VS.85).aspx
еще в процессорах 80586 и выше есть инструкция RDTSC, но ныне (на современных камнях) её использовании считается неверным (детали - в MSDN)
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
min@y™ (статус: Доктор наук), 24 мая 2011, 19:57 [#4]:
Цитата (NeStor):
хитрый таймер? это что за таймер такой-то?
Могу дать исходник. Он маленький совсем. Но я им пользуюсь давно. Нареканий пока нет.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
NeStor (статус: Посетитель), 24 мая 2011, 20:01 [#5]:
нам препод DecodeTime вроде давал. мне бы и он пошел, если б можно было еще точнее время засечь. так что за исходник?
|
|
min@y™ (статус: Доктор наук), 24 мая 2011, 20:05 [#6]:
Цитата (NeStor):
нам препод DecodeTime вроде давал. мне бы и он пошел, если б можно было еще точнее время засечь.
DecodeTime время не засекает, а декодирует TDateTime в часы, минуты, секунды и миллисекунды. Это не имеет никакого отношения к измерению времени.
Цитата (NeStor):
так что за исходник?
Щас поищу.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
bugmenot (статус: 3-ий класс), 24 мая 2011, 20:15 [#7]:
фигли тут искать
function RDTSC(): Int64;
asm
RDTSC
end;
все замечания выше остаются в силе
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
NeStor (статус: Посетитель), 24 мая 2011, 20:17 [#8]:
ок. попробую всё)
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|