Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Geschwindigkeit einer Funktion messen (https://www.delphipraxis.net/117686-geschwindigkeit-einer-funktion-messen.html)

Gargamel 23. Jul 2008 13:59


Geschwindigkeit einer Funktion messen
 
Hallo

Kennt jemand eine Lösung bzw. ist es überhaupt möglich, die Ausführungsgeschwindigkeit einer Funktion zu messen?

mkinzler 23. Jul 2008 14:00

Re: Geschwindigkeit einer Funktion messen
 
Nicht ohne Einfluss auf diese zu nehmen

sakura 23. Jul 2008 14:00

Re: Geschwindigkeit einer Funktion messen
 
Eine direkte Funktion gibt es nicht, aber mit Hilfe von Hier im Forum suchenQueryPerformanceCounter und Hier im Forum suchenQueryPerformanceFrequency ist es recht einfach möglich.

...:cat:...

sakura 23. Jul 2008 14:01

Re: Geschwindigkeit einer Funktion messen
 
Zitat:

Zitat von mkinzler
Nicht ohne Einfluss auf diese zu nehmen

Wieso, wenn man die Zeitmessung vor und nach dem Aufruf ausführt, dann sollte es doch ohne Probleme gehen.

...:cat:...

mkinzler 23. Jul 2008 14:06

Re: Geschwindigkeit einer Funktion messen
 
Zitat:

Zitat von sakura
Zitat:

Zitat von mkinzler
Nicht ohne Einfluss auf diese zu nehmen

Wieso, wenn man die Zeitmessung vor und nach dem Aufruf ausführt, dann sollte es doch ohne Probleme gehen.

...:cat:...

Stimmt :oops:

Apollonius 23. Jul 2008 14:06

Re: Geschwindigkeit einer Funktion messen
 
Auch noch zu erwähnen: Mit MSDN-Library durchsuchenGetThreadTimes bist du unabhängiger von anderen Threads, die gleichzeitig laufen, als wenn du QueryPerformanceCounter oder GetTickCount nimmst.

Bernhard Geyer 23. Jul 2008 14:08

Re: Geschwindigkeit einer Funktion messen
 
Falls es öfter benötigt wird um sein Programm schneller zu machen: AQTime ist sein Geld wert!

Meflin 23. Jul 2008 14:11

Re: Geschwindigkeit einer Funktion messen
 
Zitat:

Zitat von Bernhard Geyer
Falls es öfter benötigt wird um sein Programm schneller zu machen: AQTime ist sein Geld wert!

Wollte ich auch schon vorschlagen, wobei ich nicht weis, ob es für absolute Zeiten so gut geeignet ist. Wenn ich mich recht erinner, hat der Profiler die Ausführung doch erheblich verlangsamt...

Bernhard Geyer 23. Jul 2008 14:17

Re: Geschwindigkeit einer Funktion messen
 
Zitat:

Zitat von Meflin
Zitat:

Zitat von Bernhard Geyer
Falls es öfter benötigt wird um sein Programm schneller zu machen: AQTime ist sein Geld wert!

Wollte ich auch schon vorschlagen, wobei ich nicht weis, ob es für absolute Zeiten so gut geeignet ist. Wenn ich mich recht erinner, hat der Profiler die Ausführung doch erheblich verlangsamt...

Es kommt ja auf die verhältnisse an bzw. was ich machen will.
Wenn mir der Proviler sagt das 90% der Rechenzeit an 5 Quellcodezeilen verbraten werden ist es egal ob diese um den Faktor 5 verlangsamt wurden.
Und erheblich verlangsamt wird es nur wenn der Line-Profiler verwendet wird.

Forlan 23. Jul 2008 14:21

Re: Geschwindigkeit einer Funktion messen
 
Müsste es so nicht klappen????

Delphi-Quellcode:
procedure TForm1.Go;
var start,stop,zeit : integer;
begin
  start := GetTickCount;
     //Hier deine Funktion
  stop := GetTickCount;
  zeit := stop-start;
  ShowMessage('Gebrauchte Zeit '+ IntToStr(zeit) + ' ms';
end;

Meflin 23. Jul 2008 14:22

Re: Geschwindigkeit einer Funktion messen
 
Zitat:

Zitat von Bernhard Geyer
Wenn mir der Proviler sagt das 90% der Rechenzeit an 5 Quellcodezeilen verbraten werden ist es egal ob diese um den Faktor 5 verlangsamt wurden.

Schon klar. Aber wenn er nur wissen will "Funktion XY läuft Z Sekunden", dann ist AQTime wohl die falsche Wahl.

Abgesehen davon: vielleicht will ers ja auch im Programm ausgeben :gruebel:

Gargamel 23. Jul 2008 14:24

Re: Geschwindigkeit einer Funktion messen
 
Genau die richtigen Hinweise. Danke an alle.
Funktioniert prima.

Forlan 23. Jul 2008 14:24

Re: Geschwindigkeit einer Funktion messen
 
Zitat:

Zitat von Gargamel
Genau die richtigen Hinweise. Danke an alle.
Funktioniert prima.

welche der lösungen funktioniert denn prima???^^

Fussball-Robby 23. Jul 2008 14:29

Re: Geschwindigkeit einer Funktion messen
 
Zitat:

Zitat von Forlan
Müsste es so nicht klappen????

Delphi-Quellcode:
procedure TForm1.Go;
var start,stop,zeit : integer;
begin
  start := GetTickCount;
     //Hier deine Funktion
  stop := GetTickCount;
  zeit := stop-start;
  ShowMessage('Gebrauchte Zeit '+ IntToStr(zeit) + ' ms';
end;

GetTickCount misst Millisekunden, für Funktionen, die länger dauern, reicht das natürlich. Um einiges genauer ist aber MSDN-Library durchsuchenQueryPerformanceCounter (welches ja ganz am Anfang schon von sakura angesprochen wurde)

Gargamel 23. Jul 2008 14:31

Re: Geschwindigkeit einer Funktion messen
 
OK. Hier der Quellcode. Wundert Euch bitte nicht, warum ich ständig PChar in String konvertiere. Der Grund ist der, daß ich mit der Torque Game Engine arbeite und die komplett in C++ geschrieben wurde. Da ich aber C++ nur dann anfasse, wenn unbedingt nötig, nutze ich lieber mit der 3D Engine eine zusätzliche DLL, die ich in Delphi schreibe. Daher die Umwandlung.
Die Zeitmessung ist deswegen interessant, da KI und Wegfindung recht aufwändige Berechnungen sind. Und ich will halt wissen, wie schnell die Algorithmen ablaufen.

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var Start, Stop, Frequenzy: Int64;
    i:integer;
    name_p:PChar;
    name_s:string;
begin
  Listbox1.clear;
  QueryPerformanceFrequency(Frequenzy);
  QueryPerformanceCounter(Start);

  for i:=1 to StrToInt(Edit1.text) do
  Begin

    name_p:='Ich mag Delphi';

    name_s:=StrPas(name_p);

    listbox1.Items.Add(IntToStr(i)+': '+name_s);

  End;

  try
    QueryPerformanceCounter(Stop);
    ShowMessage(FormatFloat('0.00', (Stop - Start) * 1000 / Frequenzy) + ' Millisekunden');

  finally

  end;
end;

Apollonius 23. Jul 2008 14:32

Re: Geschwindigkeit einer Funktion messen
 
Das hat Daniel doch schon erwähnt, Robert. Wenn mich meine Erinnerung nicht trügt, wurde hier auch kürzlich ein Problem mit QueryPerformanceCounter erwähnt, das auftritt, wenn der Thread die CPU wechselt.

Bernhard Geyer 23. Jul 2008 14:36

Re: Geschwindigkeit einer Funktion messen
 
Zitat:

Zitat von Gargamel
Die Zeitmessung ist deswegen interessant, da KI und Wegfindung recht aufwändige Berechnungen sind. Und ich will halt wissen, wie schnell die Algorithmen ablaufen.

Für sowas ist ein Line-Profiler wie bei AQTime super.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 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