Jak zmierzyć czas wykonania pętli?

0

Witam,

Chciałbym napisać kod, który wyświetli mi czas wykonania pętli (sortowanie przez wstawianie).
Potrzebuje lekkiej pomocy bo coś mi nie wyświetla.

Do tej pory napisałem:

Timer1.Enabled:=true; 

PĘTLA

Timer1.Enabled:=false; 
ShowMessage('Czas wykonania sortowania: ' + inttostr(Timer1) + ' ms.');

czemu nie wyświetla wyniku. Byłbym bardzo wdzięczny za pomoc.

0

Nie wychodzi mi na tym.
moj skrypt

type
  a1 = array [0 .. 100000] of integer;
var
  LICZ: TStringlist;
  t: text;
  N, w, i, j, x: integer;
  intLicznikZamian:integer;
  intLicznikPorownan:integer;
  a: a1;
begin
  LICZ := TStringlist.Create;
  LICZ.LoadFromFile('przedsortowaniem.txt');
  N := LICZ.Count;
  LICZ.Free;
  begin
    intLicznikZamian:=0;
    intLicznikPorownan:=0;
    assignFile(t, 'przedsortowaniem.txt');
    reset(t);
    for i := 1 to N do
    begin
      readln(t, w);
      a[i] := w;
    end;
    CloseFile(t);
    for j := N - 1 downto 1 do
    begin
      x := a[j];
      inc(intLicznikPorownan);
      i := j + 1;
      while (i <= N) and (x > a[i]) do
      begin
        a[i - 1] := a[i];
        inc(i);
        inc(intLicznikZamian);
      end;
      a[i - 1] := x;
    end;
    assignFile(t, 'posortowaniu.txt');
    ReWrite(t);
    for i := 1 to N do
    begin
      Writeln(t, a[i]);
    end;
    CloseFile(t);
  end;
  Label7.Caption:=FloatToStr(N);
  Label4.Caption:=FloatToStr(intLicznikPorownan);
  Label5.Caption:=FloatToStr(intLicznikZamian);
  ShowMessage('Czas wykonania sortowania: ' + IntToStr(Time1) + ' ms.');
end;
0

To wywal ten swój skrypt, widziel funkcję która robi swoje i zmierz czas tak jak w podanym przeze mnie linku.

0

a nie mozemy pod ten skrypt napisać Ttimera?

Pomoże ktoś? bo nie wiem jak to wyświetlić.

0

To nie jest żaden skrypt - w Delphi tworzy się normalne, kompilowane i natywne aplikacje, a nie żadne skrypty; Oczywiście zaraz ktoś przyleci i nudzić zacznie, że jest odmiana stricte skryptowego Pascala, jednak w tagu jest delphi, stąd moja uwaga na temat nazewnictwa;
____Co do tematu - klasa TTimer nie nadaje się kompletnie do tego; Ona służy do wykonywania zadanego kodu cyklicznie, a Ty potrzebujesz zmierzyć czas dwa razy, do tego bezpośrednio przed i po wykonaniu sortowania;

I teraz wszystko zależy od dokładności pomiaru; Jeśli to Twoje sortowanie wykonuje się co najmniej kilkadziesiąt milisekund lub kilka sekund, możesz wykorzystać funkcję GetTickCount; Ta funkcja pobiera z systemu liczbę milisekund, więc działa z dokładnością co do jednej milisekundy;

Jeżeli krócej - będziesz potrzebował dokładniejszego pomiaru; Najdokładniejszy znany mi sposób to pomiar za pomocą funkcji QueryPerformanceCounter; Jeżeli będziesz potrzebował przeliczyć wynik na jakąś jednostkę czasu, dodatkowo użyj funkcji QueryPerformanceFrequency i prostej arytmetyki;
____A co do samego kodu - wpakowałeś wszystko do głównego bloku i zadowolony... Polecam wydzielić sobie kod sortujący do osobnej procedury - dzięki temu kod będzie czytelniejszy; Zrób to tak, aby można było wywołać procedury w ten sposób:

QueryPerformanceCounter(intStart);
MySuperHiperSortAlgorithm();
QueryPerformanceCounter(intStop);

intTime := intStop - intStart; // tu masz czas w tikach licznika

Całość umieść w głównej pętli, która powyższe instrukcje wykona np. sto czy tysiąc razy; Jednorazowy pomiar nie ma sensu, bo wynik może być oszukany.

0

Dziękuję Ci bardzo :) teraz poszło

1

W razie czego cały taki stoper można opakować w coś, np. w rekord, stary obiekt czy zwykłą klasę; Przykład:

{$mode objfpc}{$H+}

uses
  Windows;

type
  TNanoStopwatch = object
  private
    FStartCount: Int64;
    FStopCount: Int64;
  private
    function GetCounts(): Int64;
  public
    constructor Init();
  public
    procedure Start();
    procedure Stop();
  public
    property Counts: Int64 read GetCounts;
  end;

  constructor TNanoStopwatch.Init();
  begin
    FStartCount := 0;
    FStopCount  := 0;
  end;

  function TNanoStopwatch.GetCounts(): Int64;
  begin
    Result := FStopCount - FStartCount;
  end;

  procedure TNanoStopwatch.Start();
  begin
    QueryPerformanceCounter(FStartCount);
  end;

  procedure TNanoStopwatch.Stop();
  begin
    QueryPerformanceCounter(FStopCount);
  end;

var
  nsSort: TNanoStopwatch;
  intLoop: Integer;
begin
  nsSort.Init();

  for intLoop := 0 to 99 do
  begin
    nsSort.Start();
    { tu procedura sortująca }
    nsSort.Stop();

    WriteLn('Counts: ', nsSort.Counts);
  end;
end.

Bardzo prosta sprawa - w razie czego taki stoper można rozbudować, według własnych potrzeb.

1 użytkowników online, w tym zalogowanych: 0, gości: 1