Как измерить время выполнения программы с помощью счетчика меток реального времени(TSC)?
Необходимо измерить время точное время выполнения сортировки перемешиванием в Delphi
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
const
arrayLength = 20;
var
inputArray : array [1..arrayLength] of integer;
i, tempValue: integer;
firstIndex, lastIndex: integer;
procedure sort();
begin
begin
Randomize;
writeln ('Исходный массив: ');
{заполнение массива случайными числами}
for i := 1 to arrayLength do
begin
inputArray[i] := Random(200)-100;
write (inputArray[i]:4);
end;
writeln;
{Шейкерная сортировка}
firstIndex := 1; {индекс первого элемента рабочей зоны массива}
lastIndex := arrayLength; {индекс последнего элемента рабочей зоны массива}
while firstIndex < lastIndex do
begin
{проход слева направо}
for i:= firstIndex to lastIndex-1 do
if inputArray[i] < inputArray[i+1] then
begin
{обмен элементов}
tempValue := inputArray[i];
inputArray[i] := inputArray[i+1];
inputArray[i+1] := tempValue;
end;
{проход справа налево}
for i:= lastIndex downto firstIndex+1 do
if inputArray[i] > inputArray[i-1] then
begin
{обмен элементов}
tempValue := inputArray[i];
inputArray[i] := inputArray[i-1];
inputArray[i-1] := tempValue;
end;
{уменьшаем просматриваемую область}
firstIndex := firstIndex + 1;
lastIndex := lastIndex - 1;
end;
{Вывод отсортированного массива}
writeln ('Отсортированный массив: ');
for i := 1 to arrayLength do
write (inputArray[i]:4);
readln;
end
end;
function tsc: Int64;
var ts: record
case byte of
1: (count: Int64);
2: (b, a: cardinal);
end;
begin
asm
db $F;
db $31;
mov [ts.a], edx
mov [ts.b], eax
end;
tsc:=ts.count;
end;
begin
writeln(tsc)
end.
function TVGArrayFloat.SearchAny(value: single): boolean;
var a, b: int64;
begin
// тут должен быть код подготовки данных
a := tsc;
sort();
// тут должен быть код запуска сортировки
b := tsc-a;
fResultSeach.fTime := b/2600000; // вычисляем время теста
end;
begin
end.
И что вообще должно произойти в результате правильного выполнения?
Ответы (1 шт):
Автор решения: MBo
→ Ссылка
Ассемблерная вставка использует опкод команды RDTSC, которая известна современным Дельфям. Однако использование этой функции в настоящее время сомнительно - она возвращает количество тактов процессора (а кто будет частоту мерить, а не делить на сомнительную величину?), а сейчас ядер много, они могут спать и динамически менять частоту.
Лучше так:
uses System.Diagnostics
var
Stopwatch: TStopwatch;
Elapsed: TTimeSpan;
Seconds: Double;
Stopwatch := TStopwatch.StartNew;
сортировать;
Elapsed := Stopwatch.Elapsed;
Seconds := Elapsed.TotalSeconds;