Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   Laufzeit einer Prozedur/Funktion (https://www.delphipraxis.net/124480-laufzeit-einer-prozedur-funktion.html)

holle 19. Nov 2008 19:10


Laufzeit einer Prozedur/Funktion
 
Ich würde gerne eine Prozedur schreiben zum Messen der Laufzeit einer belibigen Prozedur oder Funktion. Beim Aufruf der Prozedur soll dann die Prozedur/Funktion übergeben werden. So hatte ich angefangen, das funktioniert aber noch nicht:

Delphi-Quellcode:
program zeit;
type
  proc = procedure;

procedure beispiel;
begin
  // mache irgendwas
end;

procedure laufzeit(p: proc);
begin
  // messe laufzeit
  p;
  // messe laufzeit
  // gib laufzeit aus
end;

begin
  laufzeit(beispiel);
end.

SirThornberry 19. Nov 2008 19:16

Re: Laufzeit einer Prozedur/Funktion
 
woran genau scheiterst du? An der Ausgabe der Zeit?

holle 19. Nov 2008 19:30

Re: Laufzeit einer Prozedur/Funktion
 
Der Prozedur Laufzeit muss doch eine Variable übergeben werden (die Funktion/Prozedur). Wenn ich den proc so definiere wie oben, bekomme ich beim Aufruf mit einer Prozedur mit zwei Parametern den Fehler: Incompatible type for arg no. 1: Got "untyped", expected "<procedure variable type of procedue;Register>".

Luckie 19. Nov 2008 20:33

Re: Laufzeit einer Prozedur/Funktion
 
Nun ja, wie macht man es denn im richtigen Leben, wenn man keine Stoppuhr hat? Man merkt sich die Anfangs- und Endzeit und zieht dann von der Endzeit die Anfangszeit ab:
Delphi-Quellcode:
start := GetTickCoint;
// tu was
end := GetTickCount;
zeit := end - start;
Da GetTickCount die Zeit in Millisekunden angibt, hast du danach die Laufzeit in Millisekunden.

Allerdings ist zu beachten, dass Windows ein Multitaskbetriebssystem ist und dieser Wert ein sehr grober Wert ist, da die CPU zwischenzeitlich auch Code in anderen Threads anderer Prozesse ausführt. Willst du es genauer musst du mit MSDN-Library durchsuchenGetThreadTimes arbeiten oder versuchen die CPU Taktzyklen zu ermitteln. Das wäre dann am genausten und von der Auslastung des Systems unabhängig.

Bernhard Geyer 19. Nov 2008 20:37

Re: Laufzeit einer Prozedur/Funktion
 
Falls Du ein paar € ausgeben kannst: Es gibt mit AQTime ein bezahlbares, klasse Tool das in wenigen Minuten ohne Quellcodeanpassungen Hotspotanalysen ermöglicht.

holle 20. Nov 2008 07:01

Re: Laufzeit einer Prozedur/Funktion
 
getTickCount zur messung der Laufzeit kenne ich. Ich würde nur erne eine Prozedur schreiben, der ich eine beliebige andere Prozedur übergeben kann um somit die Laufzeit zu messen.

alzaimar 20. Nov 2008 07:41

Re: Laufzeit einer Prozedur/Funktion
 
Eine beliebige andere Prozedur/Funktion wird nicht gehen, denn Du musst ihr ja Parameter übergeben. Deine Idee funktioniert für parameterlose Routinen. Für andere musst du eben einen anderen Prozedurtypen deklarieren. Ich glaube, Du denkst Dir so etwas:
Delphi-Quellcode:
Procedure LaufzeitMessen (Proc : TProzedurMitBeliebigenParametern);
Begin
  // Messen
End;
...
Laufzeitmessen(EineProzedur(a,b,c,d,e));
Das geht so zwar nicht, aber wenn Du die zu testende Routine in eine eigene parameterlose Prozedur packst, und dann deine Laufzeitmessung mit dieser Prozedur aufrufst, geht das schon. Na ja, irgendwie jedenfalls.
Delphi-Quellcode:
Procedure Laufzeitmessen (Proc : TProcedure);
Begin
  /Messen
End;

Procedure TestProc;
Var
  a,b : Integer;
  c,d,e : String; // Zum Beispiel;

Begin
  a := 1; b := 2; ... // Parameter setzen oder einmalig global
  EineProzedur(a,b,c,d,e);
End;

...
Laufzeitmessen (TestProc);

holle 20. Nov 2008 09:27

Re: Laufzeit einer Prozedur/Funktion
 
schade, dann geht das wohl nicht so wie ich es mir vorgestellt hatte. dann werde ich das doch gleich mit in die prozedur einbauen, ist wohl am einfachsten.

alzaimar 20. Nov 2008 09:32

Re: Laufzeit einer Prozedur/Funktion
 
Denk dran, das GetTickCount nur auf ein paar MS genau ist. Die Ungenauigkeit potentiert sich, wenn du viele kurze Einzelmessungen addierst. Ich glaube, GetTickCount geht auf 18ms genau, Du solltest also mindestens 1-2 Sekunden messen, um eine 1%-Genauigkeit zu bekommen. Du kannst auch mit dem PerformanceCounter von Windows arbeiten

bernau 20. Nov 2008 11:02

Re: Laufzeit einer Prozedur/Funktion
 
Zitat:

Zitat von Bernhard Geyer
Falls Du ein paar € ausgeben kannst: Es gibt mit AQTime ein bezahlbares, klasse Tool das in wenigen Minuten ohne Quellcodeanpassungen Hotspotanalysen ermöglicht.

Kann ich nur bestätigen! Klasse Tool!


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz