Как измерить время выполнения программы с помощью счетчика меток реального времени(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;
→ Ссылка