AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Rechenzeit stoppen

Ein Thema von dezz · begonnen am 11. Feb 2005 · letzter Beitrag vom 12. Feb 2005
Antwort Antwort
Seite 1 von 2  1 2      
dezz

Registriert seit: 11. Feb 2005
5 Beiträge
 
#1

Rechenzeit stoppen

  Alt 11. Feb 2005, 20:49
Hallo,

ich bearbeite ein Projekt zu Sortierverfahren mit Delphi. Um diese dann auf Geschwindigkeit und Effizienz zu vergleichen, muss ich die Zeit stoppen koennen, die der Algorithmus braucht um eine Liste mit n Elementen zu sortieren.

Als Beispiel habe ich folgenden Sortieralgorithmus: Sortieren durch direkte Auswahl:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i,j,hilf,platz,kleinste:integer;
begin
timer.Enabled:=true;

for i:=1 to 99999 do
begin
kleinste:=f[i];
platz:=i;
   for j:=i to 100000 do
    begin
      if f[j]<kleinste then
        begin
          kleinste:=f[j];
          platz:=j;

        end;
    end;
   hilf:=f[i];
   f[i]:=f[platz];
   f[platz]:=hilf;


end;
timer.enabled:=false;
listbox1.Items.clear;
for i:=1 to 100000 do
  listbox1.items.add(inttostr(f[i]));


end;
nicht ueber die grossen Zahlen wundern, nur zum Test genommen damit es auch ne weile dauert *g*

Mit Hilfe des Timers wollte ich die Zeit festhalten die der Algo braucht, nur scheinbar wird das OnTimer Event nicht aufgerufen.

Kann mir jemand sagen wie ich dies mit dem Timer realisieren kann oder ob es eine bessere Moeglichkeit gibt die Zeit des Algo zu stoppen?

danke mfg dezz
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#2

Re: Rechenzeit stoppen

  Alt 11. Feb 2005, 20:54
Im sortier-Algo: Wenn fertig, dann boolsche Variable auf true setzen. Im OnTimer dann abfragen, ob die jeweilige Variable true ist. Wenn ja, dann Timer disablen

Ansonsten im OnTimer einfach nur eine Variable von 1-* hochzählen und am Ende die Zahl ausgeben lassen

//edit: Hab deinen Code nochmal überflogen: Den Teil mit dem Timer disablen von mir kannste dann weglassen
  Mit Zitat antworten Zitat
dezz

Registriert seit: 11. Feb 2005
5 Beiträge
 
#3

Re: Rechenzeit stoppen

  Alt 11. Feb 2005, 21:05
hab das schon so probiert, im OnTimer ne Zahl hochzaehlen zu lasssen ....
quasi inc(a) .. und am ende dann a ausgeben lassen, nur dass a immer Null bleibt, OnTimer also anscheinend garnicht aufgerufen wird.
(kann es sein, dass der Computer waehrend er in der Schleife des Algo ist OnTimer nicht abfragt?)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

Re: Rechenzeit stoppen

  Alt 11. Feb 2005, 21:09


Nimm 2 Variablen vom Typ Int64.
Bei beginn der Zeitmessung machst du queryperformancecounter (variable1); am ende sowas wie
Delphi-Quellcode:
queryperformancecounter (variable2);
variable1 := variable2 - variable1
queryperformancefrequency (variable2);
showmessage ('Abgelaufene Zeit: ' + floattostr (variable1 / variable2) + ' sek');
  Mit Zitat antworten Zitat
dezz

Registriert seit: 11. Feb 2005
5 Beiträge
 
#5

Re: Rechenzeit stoppen

  Alt 11. Feb 2005, 21:29
danke jfheins,

also es funktioniert schonmal, nur koenntest du mir bitte erklaeren wie genau das funktioniert? also was welcher schritt macht und was queryperformancecounter macht? hab in der hilfe nichts dazu gefunden und muesste schon wissen wie es funktioniert da ich das projekt fuer die schule mache und auch erklaeren muss wie es funktioniert.

mfg dezz
  Mit Zitat antworten Zitat
Benutzerbild von Lantis
Lantis

Registriert seit: 13. Mär 2003
16 Beiträge
 
Delphi 6 Personal
 
#6

Re: Rechenzeit stoppen

  Alt 11. Feb 2005, 21:39
Hi,
mann könnte es doch sicher auch einfachso machen:

Delphi-Quellcode:
var start:TTime;

begin
  start:=now;

  ...//sortieren


  ShowMessage(TimeToStr(now-start));
end;
nur so für grobe Sekunden

Gruß Lantis
  Mit Zitat antworten Zitat
dezz

Registriert seit: 11. Feb 2005
5 Beiträge
 
#7

Re: Rechenzeit stoppen

  Alt 11. Feb 2005, 21:45
ja danke dir auch Lantis,

so wird es sicher auch funktionieren, hilft mir aber bei meinem Projekt nicht weiter, da ich die Zeit doch wenigstens auf hundertstel Sekunden genau brauche um die Verfahren moeglichst genau zu vergleichen.

trotzdem danke
  Mit Zitat antworten Zitat
Oxmyx

Registriert seit: 21. Sep 2004
499 Beiträge
 
#8

Re: Rechenzeit stoppen

  Alt 11. Feb 2005, 21:50
So verwendet man den High Performance Counter:

Delphi-Quellcode:
function GetTime(): Double;
{$WRITEABLECONST ON}
const
  bInitialized: BOOL = FALSE;
  qwTicksPerSec: Int64 = 0;
  qwTime: Int64 = 0;
{$WRITEABLECONST OFF}
begin
  if not bInitialized then begin
    QueryPerformanceFrequency(qwTicksPerSec);
    bInitialized := TRUE;
  end;
  QueryPerformanceCounter(Int64(qwTime));
  Result := qwTime / qwTicksPerSec;
end;


{...}

var
  dTime1, dTime2: Double;
begin
  dTime1 := GetTime();
  {
    Berechnungen....
  }

  dTime2 := GetTime();
  ShowMessage('Zeit: ' + FloatToStr(dTime2 - dTime1));
end;
Bevor du die Funktion zum Zeitmessen verwendest, solltest du sie wohl mindestens einmal aufgerufen haben, dass sie bereits initialisiert ist. Sonst kann das Ergebnis verfälscht werden.

Das ganze funktioniert so:
Wenn die Funktion zum ersten Mal aufgerufen wird, fragt sie die Taktfrequenz eines bestimmten Chips auf dem Mainboard ab. Dieser tickt im Regelfall mit ca. 3-4 Millionen Ticks pro Sekunde. Die Frequenz wird gespeichert. Danach wird die Funktion QueryPerformanceCounter aufgerufen, die die Ticks seit Start des Computers zurückliefert. Wenn man diese Anzahl nun durch die Taktfrequenz des Counters teilt, erhält man einen sehr exakten Wert, seit wann das System läuft. Aus der Differenz zweier Zeitmessungen kann man dann die verstrichene Zeit auf wenige Mikrosekunden genau berechnen.
  Mit Zitat antworten Zitat
Benutzerbild von Binärbaum
Binärbaum

Registriert seit: 19. Jan 2005
Ort: Elstra
764 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Rechenzeit stoppen

  Alt 11. Feb 2005, 22:21
Man kann das auch mit GetTickCount machen:
Delphi-Quellcode:
var start: Cardinal;
    i: Integer;
begin
 start:= GetTickCount;
 for i:=0 to 9999 do begin
  //Mach irgendwas...

 end;
 start:= GetTickCount - start;
 ShowMessage('Zeit: '+IntToStr(start)+' ms');
end;
[Edit]
Zur Erklärung:
GetTickCount liefert die Zeit seit Systemstart in Millisekunden.
[/Edit]

MfG
Binärbaum
There are exactly 10 kinds of people: those who understand binary, and those who don't.
---
"Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek
  Mit Zitat antworten Zitat
Tubos

Registriert seit: 25. Feb 2004
Ort: Yspertal (Niederösterreich)
1.014 Beiträge
 
Delphi 7 Personal
 
#10

Re: Rechenzeit stoppen

  Alt 11. Feb 2005, 23:27
Zitat:
Man kann das auch mit GetTickCount machen
Das ist zwar möglich, aber eine eher schlechte Idee da GetTickCount nur auf etwa 4 ms genau ist, d.h. der Aufruf von GetTickCount liefert 4 ms lang den selben Wert.
Lukas
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz