Code-Ausführungszeit messen



  • Hi,

    kann mir zwar nicht vorstellen, dass das noch nie jemand wissen wollte, aber gefunden hab ich's nicht:
    Wie kann ich beim CodeGear2009 die Ausführungszeit von Code-Segmenten messen? Also zwischen zwei Haltepunkten oder so.



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • entweder manuell mittels einer Funtion, die dir die aktuelle Zeit hergibt, wesentlich komfortabler gehts allerdings mittels eines Profilers. Ob CodeGears2009 einen Profiler hat oder nicht, musst du allerdings selbst rausfinden, das relevante Keyword kennst du jetzt ja 😉



  • Nach weiterer Sucherei bin ich nun bei GetTickCount() gelandet. Ist super einfach zu verwenden, brauch keine Zusatzmodule oder Programmieraufwand und liefert mir ein int mit dem Millisekundenwert!



  • Man sollte dabei beachten, dass generell unter Windows die zeitliche Messung für das Ausführen eines bestimmten Programmabschnittes durch den Taskscheduler verfälscht werden kann, besonders wenn noch andere Programme mit hoher CPU Auslastung laufen.

    Gruß
    Markus



  • Heimelchen schrieb:

    Nach weiterer Sucherei bin ich nun bei GetTickCount() gelandet. Ist super einfach zu verwenden, brauch keine Zusatzmodule oder Programmieraufwand und liefert mir ein int mit dem Millisekundenwert!

    Bedenke, dass GetTickCount eine sehr geringe Auflöung hat und für kleine Intervalle nicht geeignet ist. Wenn du wissen willst ob dein ganz Programm nun 5 oder eher 10 Sekunden lang läuft, reicht das aus. Wenn du aber wissen willst wie viele ns ein Schleifendurchlauf braucht, kommst du damit nicht mehr weiter. QueryPerformanceCounter ist für solche Zwecke besser geeignet.

    Wobei ein externer Profiler sowieso am bequemsten ist und man nicht so viel falsch machen kann.



  • Ich messe immer mit dem CPU Befehl RDTSC, das misst die CPU Takte. Viel genauer geht es mit Standardmitteln glaube ich nicht. Hier ist nur Vorsicht geboten wenn Mehrkernanwendungen ins Spiel kommen.

    Ohne Assembler und unter Windows schau mal nach QueryPerformanceFrequency zusammen mit QueryPerformanceCounter.



  • Nukularfüsiker schrieb:

    [...]aber wissen willst wie viele ns ein Schleifendurchlauf braucht, kommst du damit nicht mehr weiter. QueryPerformanceCounter ist für solche Zwecke besser geeignet.

    Wobei ein externer Profiler sowieso am bequemsten ist und man nicht so viel falsch machen kann.

    ns ? Nanosekunden ? UNTER WINDOWS ? wie soll das denn gehen ?



  • Ich glaube der Windowscounter hatte eine Auflösung von knapp unter einer Mikrosekunde.



  • Ja QueryPerformanceCounter() hat eine Auflösung im Bereich von 50 ns iirc.
    Mit RDTSC ist in Hinblick auf präemptives Multitasking genauso Vorsicht geboten. Vor allem aber stellen Multicore CPUs afaik ein Problem dar wenn man nicht entsprechende Maßnahmen ergreift, es könnte passieren dass dein Thread unterbrochen wird und auf einem anderen Core weiterlauft was natürlich dazu führt dass RDTSC kompletten Blödsinn liefert.


Anmelden zum Antworten