2016-06-23 10 views
0

Wie kann ich die Ausführungszeit einer Zeile Code in C++ in Windows messen. Ich bin Einfügen von über 1,00,000 Aufzeichnungen boost::multi_index_container wie folgt:Messen Sie die Ausführungszeit eines Funktionsaufrufs in C++

while(...) //read a single record from a csv file until EOF 
{ 
    ... 
    while(...) // split the record into components based on delimiter 
    { 
     ... 
    } 
    //insert into boost::multi_index_container 
} 

Ich brauche die Zeit zu finden, benötigt, um alle Datensätze einzufügen, aber ohne die Ausführungszeit von Schleifen. Das Starten eines timer oder irgendetwas kurz vor der Einfügefunktion und das Berechnen der verstrichenen Zeit unmittelbar nach dem Funktionsaufruf ergibt 0 nanoseconds als Ergebnis. Also kann ich die Zeit nicht berechnen, indem ich die einzelnen Zeiten zusammenfasse. Was ist die Lösung?

+0

Im Prinzip könnten Sie es wie folgt angehen: 1. Messen Sie die Zeit einer leeren Schleife (aber stellen Sie sicher, dass es nicht weg optimiert ist). 2. Messen Sie die Zeit Ihrer Einfügeschleife. 3. Nimm den Unterschied. Teufel ist jedoch im Detail, wenn Sie messen möchten, sollten Sie den optimierten Code messen, nicht den Debug-Code. Und dann gibt es eine Chance, der Optimierer macht es schwieriger für Sie. Überprüfen Sie die Assembler-Ausgabe, um sicherzustellen, dass Sie messen, was Sie zu messen glauben. Da Sie nicht möchten, dass die Datei auch mal gelesen wird, könnten Sie einige zusätzliche Schritte und Unterschiede finden, um endlich das zu bekommen, was Sie brauchen. – BitTickler

+0

Ich frage mich, warum Sie dieses Maß es brauchen? – K117

+0

@pradyot: Ich möchte eine Lösung für Windows-System – Jackzz

Antwort

2

Unter Windows können Sie genaue Messungen mit QueryPerformanceCounter erhalten.

+0

QPC gibt die Ausführungszeit für jede einzelne Einfügung als 0 an. Wie ich erwähnt habe, brauche ich die gesamte Ausführungszeit, um die eine lakh Datensätze einzufügen. – Jackzz

+0

Sie müssen möglicherweise CPU-Zyklen irgendwie für etwas, das feinkörnig ist, messen. – goobliata

+0

Wenn das, was Sie messen möchten, zu klein ist, messen Sie die Zeit, die es braucht, um es mehrmals zu tun (es dauert also eine messbare Zeit). Dann ist die magische Operation "Division": "total_time/N", wenn N die Anzahl der Male ist, die die Operation ausgeführt wurde. Da Ihr Schleifen- und Dateizugriff auch zu total_time beiträgt, benötigen Sie Vergleichsläufe desselben Codes ohne Ihre Einfügeoperation. Dann '' (total_time - total_time_compare)/N''. – BitTickler

0

möglich Duplikat von How to calculate a time difference in C++. Es gibt viele Möglichkeiten, dies zu tun. Eine, die ich mag, verwendet Chrono.

#include <iostream> 
    #include <chrono> 

    using namespace std; 
    using namespace std::chrono; 



    int main() 
    { 
    high_resolution_clock::time_point t1 = high_resolution_clock::now(); 
    //your code here 
    high_resolution_clock::time_point t2 = high_resolution_clock::now(); 

    auto duration = duration_cast<microseconds>(t2 - t1).count(); 

    cout << duration; 
    return 0; 
    } 
+0

Die berechnete Zeit ist in Mikrosekunden. –

+0

Ich habe es schon versucht ... wieder gibt es keine Ausführungszeit mit Ausnahme der Schleifen – Jackzz

+0

Es funktioniert gut auf meinem Computer. Stört es dich, wenn ich frage, was machst du genau? Haben Sie die anderen im Link angegebenen Methoden versucht? –