Wie kann ich die Ausführungszeit eines Abschnitts meines Programms in C finden?

StackOverflow https://stackoverflow.com/questions/173409

  •  05-07-2019
  •  | 
  •  

Frage

Ich versuche, einen Weg zu finden, um die Ausführungszeit eines Abschnitts von Code in C Ich habe bereits sowohl Zeit versucht haben, zu bekommen () und Uhr () von time.h, aber es scheint, dass die Zeit () zurückkehrt Sekunden und Takt () scheinen mir Millisekunden zu geben (oder Hundertstelsekunden?) ich aber etwas präziser möchte. Gibt es eine Möglichkeit ich die Zeit mit zumindest mikrosekundengenau greifen kann?

Dies muss nur in der Lage sein, unter Linux zu kompilieren.

War es hilfreich?

Lösung

Sie bezeichnet clock() und time() - suchen Sie gettimeofday()? Das füllt in einem struct timeval, die nur wenige Sekunden und Mikrosekunden enthalten.

Natürlich ist die tatsächliche Auflösung ist bis auf die Hardware.

Andere Tipps

Für das, was es wert ist, hier ist eine, die nur ein paar Makros:

#include <time.h>
clock_t startm, stopm;
#define START if ( (startm = clock()) == -1) {printf("Error calling clock");exit(1);}
#define STOP if ( (stopm = clock()) == -1) {printf("Error calling clock");exit(1);}
#define PRINTTIME printf( "%6.3f seconds used by the processor.", ((double)stopm-startm)/CLOCKS_PER_SEC);

Dann nutzen Sie es nur mit:

main() {
  START;
  // Do stuff you want to time
  STOP;
  PRINTTIME;
}

http://ctips.pbwiki.com/Timer

Sie möchten einen Profiler Anwendung.

Such Schlüsselwörter bei SO und Suchmaschinen: linux Profilierungs

Hier finden Sie aktuelle gettimeofday , clock_ * oder get / setitimer .

Versuchen Sie "bench.h" ; es können Sie einen START_TIMER setzen; und STOP_TIMER ( "Name"); in Ihren Code, so dass Sie jeden Code-Abschnitt beliebig Benchmark (Hinweis: nur für kurze Abschnitte empfohlen, die Dinge nicht Dutzende von Millisekunden oder mehr nehmen). Seine präzise auf den Taktzyklus, wenn auch in einigen seltenen Fällen kann es ändern, wie der Code in zwischen kompiliert wird, in dem Fall, dass Sie besser sind mit einem Profiler aus (obwohl Profilometer im Allgemeinen mehr Aufwand ist für bestimmte Abschnitte des Codes zu verwenden).

Es funktioniert nur auf x86.

Sie können für eine googeln wollen Instrumentierung Werkzeug.

Sie werden keine Bibliotheksaufruf finden, die Sie erhalten Vergangenheit die Uhr Auflösung Ihrer Plattform können. Entweder einen Profiler verwenden (Mann gprof) als ein weiteres Plakat vorgeschlagen, oder - quick & dirty - legt eine Schlinge um den beanstandeten Codeabschnitt es oft auszuführen, und verwendet Uhr ().

gettimeofday() liefern Sie mit einer Auflösung von Mikrosekunden, während clock_gettime() bietet mit einer Auflösung von Nanosekunden.

int clock_gettime(clockid_t clk_id, struct timespec *tp);

Die clk_id identifiziert die Uhr genutzt werden. Verwenden Sie CLOCK_REALTIME, wenn Sie eine systemweite Uhr sichtbar für alle Prozesse wollen. Verwenden Sie CLOCK_PROCESS_CPUTIME_ID für pro-Process-Timer und CLOCK_THREAD_CPUTIME_ID für einen Thread-spezifischen Timer.

Es hängt von den Bedingungen .. Profilometer für die allgemeine globale Ansichten aber nett, wenn Sie wirklich einen genauen Überblick meine Empfehlung KISS ist benötigen. Führen Sie einfach den Code in einer Schleife, so dass es eine Minute oder so in Anspruch nimmt. Dann berechnen einen einfachen Durchschnitt bezogen auf die Gesamtlaufzeit und ausgeführt Iterationen.

Dieser Ansatz ermöglicht Ihnen:

  1. Erhalten Sie genaue Ergebnisse mit niedriger Auflösung Timer.

  2. Nicht in Probleme laufen, wo Instrumentierung mit hohen Geschwindigkeit Caches (L2, L1, branch..etc) stört die Nähe des Prozessor. Allerdings läuft den gleichen Code in einer engen Schleife kann auch optimistisch Ergebnisse erzielen, die nicht reale Bedingungen widerspiegeln.

Sie wissen nicht, welche Umwelt / OS Sie arbeiten, aber Ihr Timing ungenau sein kann, wenn ein anderer Thread, einer Aufgabe oder Prozess Ihre Timecode in der Mitte vorbelegt. Ich schlage vor, zu erforschen Mechanismen wie Mutexe oder Semaphore zu anderen Threads zu verhindern preemting Ihren Prozess.

Wenn Sie auf x86 oder x64 entwickeln, warum nicht den Time Stamp Counter verwenden: RDTSC .

Es ist zuverlässiger als Ansi C-Funktionen wie time () oder Takt () als RDTSC eine atomare Funktion. Mit C-Funktionen für diesen Zweck können Probleme vorstellen, wie Sie haben keine Garantie, dass der Thread sie ausgeführt wird in dem Wert sich eine genaue Beschreibung der tatsächlichen Ausführungszeit versuchen Sie nicht geschaltet werden und als Ergebnis wird bestätigt, messen zu .

Mit RDTSC Sie können dies besser messen. Sie müssen die Zecke zählen wieder in einen Menschen lesbare Zeit H konvertieren: M:. S-Format, das auf dem Prozessoren Taktfrequenz abhängen wird aber Google um, und ich bin sicher, dass Sie Beispiele finden

Doch auch bei RDTSC werden Sie Ihr Code sein, einschließlich der Zeit wurde aus der Ausführung eingeschaltet, während eine bessere Lösung als die Zeit mit () / Takt (), wenn Sie eine genaue Messung benötigen Sie einen Profiler drehen haben das wird Instrument Code und berücksichtigen, wenn Ihr Code nicht tatsächlich aufgrund Kontextwechsel oder was auch immer ausgeführt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top