2016-12-10 4 views
7

Ich bin neu in C++ und ich weiß nicht viel über seine Bibliothek. Ich brauche Zeitanalyse verschiedener Sortieralgorithmen, für die ich die aktuelle Zeit in Millisekunden bekommen muss. Gibt es eine Möglichkeit, das zu tun?Wie bekomme ich die aktuelle Zeit in Millisekunden?

+1

Blick in std :: chorno – DanielCollier

+0

Für die Analyse von Algorithmen Sortier Millisekunden niedrig genug, um die Auflösung und „aktuelle Zeit“ isn kann nicht‘sein t wirklich, was du sowieso brauchst. Sie möchten die relative Zeit für die Ausführung einer Aufgabe. 'std :: chrono :: high_resolution_clock' ist wahrscheinlich, was Sie wollen. – Chad

+0

Danke gsamaras für die Lösung, nur kleine Zweifel, wie jemand oben in den Kommentaren erwähnt, dass die aktuelle Zeit eine relative Zeit ist, in Java wird die aktuelle Zeit von Mitternacht 1sr Jan 1970 berechnet, so high_resolution_clock :: now() -Funktion gibt Zeit relativ zu welche Zeit? –

Antwort

12

Verwenden Sie einfach std::chrono. Das allgemeine Beispiel unten mal die Aufgabe „des Druckens 1000 Sterne“:

#include <iostream> 
#include <ctime> 
#include <ratio> 
#include <chrono> 

int main() 
{ 
    using namespace std::chrono; 

    high_resolution_clock::time_point t1 = high_resolution_clock::now(); 

    std::cout << "printing out 1000 stars...\n"; 
    for (int i=0; i<1000; ++i) std::cout << "*"; 
    std::cout << std::endl; 

    high_resolution_clock::time_point t2 = high_resolution_clock::now(); 

    duration<double, std::milli> time_span = t2 - t1; 

    std::cout << "It took me " << time_span.count() << " milliseconds."; 
    std::cout << std::endl; 

    return 0; 
} 

Statt die Sterne zu drucken, werden Sie Ihren Sortieralgorithmus gibt Ort und Zeit misst es.


Vergessen Sie nicht, die Optimierungsflags für Ihren Compiler zu aktivieren, wenn Sie ein Benchmarking durchführen möchten, z. Für benötigen Sie -O3. Die Lage ist ernst, zu überprüfen, was mit mir passiert, wenn ich nicht tun: Why emplace_back is faster than push_back?


Ps: Wenn Ihr Compiler nicht nicht unterstützt, dann könnte man andere Methoden suchen in meiner Time Measurements (C++).


Ein spezifisches (Spielzeug) Beispiel durch meine Verwendung Quicksort (C++) wäre:

#include <iostream> 
#include <ctime> 
#include <ratio> 
#include <chrono> 

void quickSort(int a[], int first, int last); 
int pivot(int a[], int first, int last); 
void swap(int& a, int& b); 
void swapNoTemp(int& a, int& b); 

using namespace std; 
using namespace std::chrono; 

int main() 
{ 
    int test[] = { 7, -13, 1, 3, 10, 5, 2, 4 }; 
    int N = sizeof(test)/sizeof(int); 

    cout << "Size of test array :" << N << endl; 

    high_resolution_clock::time_point t1 = high_resolution_clock::now(); 

    // I want to measure quicksort 
    quickSort(test, 0, N-1); 

    high_resolution_clock::time_point t2 = high_resolution_clock::now(); 

    duration<double> time_span = t2 - t1; 

    std::cout << "It took me " << time_span.count() << " seconds."; 
    std::cout << std::endl; 

    return 0; 
} 

und der Ausgang ist jetzt:

Georgioss-MacBook-Pro:~ gsamaras$ g++ -Wall -std=c++11 -O3 main.cpp 
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
Size of test array :8 
It took me 3.58e-07 seconds. 

Es ist so einfach. Glückliches Benchmarking! =)


EDIT:

high_resolution_clock::now() Funktion gibt Zeit relativ zu welchem ​​Zeitpunkt?

Von std::chrono:

Zeitpunkt

Ein Verweis auf einen bestimmten Zeitpunkt, wie der einen Geburtstag, die heutigen Morgendämmerung, oder wann der nächste Zug fährt. In dieser -Bibliothek drücken Objekte der time_point-Klassenvorlage dies durch unter Verwendung einer Dauer relativ zu einer Epoche aus (dies ist ein fester Zeitpunkt , der allen time_point-Objekten gemeinsam ist, die dieselbe Uhr verwenden).

, wo man diese epoch and time_point example überprüfen konnte, welche Ausgänge:

time_point tp is: Thu Jan 01 01:00:01 1970 
+1

Danke gsamaras für die Lösung. –

+2

Sie können Ihren ersten Codeblock vereinfachen, indem Sie ihn in einer doppelbasierten Millisekunde ohne explizite Umwandlung zuweisen: 'duration time_span = t2 - t1;'. Und dann können Sie dies ohne manuelle Umwandlung in Millisekunden ausdrucken: '<< time_span.count() <<" Millisekunden. "'. Sie können den expliziten 'duration_cast' auch in Ihrem zweiten Beispiel löschen. Weitere Tipps zum Schreiben von zuverlässigerem "Chrono" -Code finden Sie hier: https://www.youtube.com/watch?v=P32hvk8b13M –

+0

@HowardHinnant coole Tipps in Ihrem Kommentar und Video! Vielen Dank. Ich habe meine Antwort aktualisiert, hoffe, dass es dir jetzt gefällt. =) – gsamaras

Verwandte Themen