0 - Delta
Verwenden Sie eine Deltafunktion zur Berechnung von Zeitdifferenzen:
auto start = std::chrono::steady_clock::now();
std::cout << "Elapsed(ms)=" << since(start).count() << std::endl;
since
akzeptiert einen beliebigen Zeitpunkt und erzeugt eine beliebige Dauer (Standard ist Millisekunden). Sie ist definiert als:
template <
class result_t = std::chrono::milliseconds,
class clock_t = std::chrono::steady_clock,
class duration_t = std::chrono::milliseconds
>
auto since(std::chrono::time_point<clock_t, duration_t> const& start)
{
return std::chrono::duration_cast<result_t>(clock_t::now() - start);
}
Demo
1 - Zeitschaltuhr
Verwenden Sie einen Timer, der auf std::chrono
:
Timer clock; // Timer<milliseconds, steady_clock>
clock.tick();
/* code you want to measure */
clock.tock();
cout << "Run time = " << clock.duration().count() << " ms\n";
Demo
Timer
ist definiert als:
template <class DT = std::chrono::milliseconds,
class ClockT = std::chrono::steady_clock>
class Timer
{
using timep_t = typename ClockT::time_point;
timep_t _start = ClockT::now(), _end = {};
public:
void tick() {
_end = timep_t{};
_start = ClockT::now();
}
void tock() { _end = ClockT::now(); }
template <class T = DT>
auto duration() const {
gsl_Expects(_end != timep_t{} && "toc before reporting");
return std::chrono::duration_cast<T>(_end - _start);
}
};
Als Howard Hinnant darauf hingewiesen, verwenden wir eine Dauer für den Verbleib in der chrono
Typsystem und führen Operationen wie Mittelwertbildung oder Vergleiche durch (hier bedeutet dies z. B. die Verwendung von std::chrono::milliseconds
). Wenn wir nur IO machen, verwenden wir die count()
oder Ticks einer Dauer (z. B. hier Anzahl der Millisekunden).
2 - Instrumentierung
Jede aufrufbare Funktion (Funktion, Funktionsobjekt, Lambda usw.) kann für das Benchmarking instrumentiert werden. Angenommen, Sie haben eine Funktion F
aufrufbar mit Argumenten arg1,arg2
führt diese Technik zu:
cout << "F runtime=" << measure<>::duration(F, arg1, arg2).count() << "ms";
<strong>Demo</strong>
measure
ist definiert als:
template <class TimeT = std::chrono::milliseconds
class ClockT = std::chrono::steady_clock>
struct measure
{
template<class F, class ...Args>
static auto duration(F&& func, Args&&... args)
{
auto start = ClockT::now();
std::invoke(std::forward<F>(func), std::forward<Args>(args)...);
return std::chrono::duration_cast<TimeT>(ClockT::now()-start);
}
};
Wie in (1) erwähnt, ist die Verwendung der Dauer ohne .count()
ist vor allem für Clients nützlich, die eine Reihe von Dauern vor der E/A nachbearbeiten wollen, z. B. für den Durchschnitt:
auto avg = (measure<>::duration(func) + measure<>::duration(func)) / 2;
std::cout << "Average run time " << avg.count() << " ms\n";
+ Diese ist der Grund für den weitergeleiteten Funktionsaufruf.
+Der vollständige Code ist zu finden unter aquí
+Mein Versuch, eine Benchmarking-Rahmen basierend auf Chrono wird aufgezeichnet aquí
+Alt démo
10 Stimmen
Ich verstehe die Frage nicht. Natürlich sind die Werte unterschiedlich. Dazwischen ist Zeit vergangen, also
time()
gibt einen anderen Wert zurück.1 Stimmen
Was meinen Sie mit "Ich verstehe nicht, warum die Werte im Vorher und Nachher unterschiedlich sind"? Sie erhalten die aktuelle Zeit (in Sekunden seit dem 1. Januar 1970) mit
time(NULL)
... das zweite Mal, wenn Sie es aufrufen, wird N Sekunden nach dem ersten und damit ... anders sein (es sei denn, was auch immer es ist Sie tun, dauert nicht eine Sekunde zu beenden ... in diesem Fall, es wird das gleiche wie das erste sein).1 Stimmen
Können Sie uns sagen, was gedruckt wird und wie lange es dauert, wenn Sie es mit einer Stoppuhr oder einer Wanduhr (oder einem Kalender) messen?
5 Stimmen
Entschuldigung, ich meine, dass beide Werte gleich sind. Ich habe meine Frage falsch geschrieben.
2 Stimmen
Siehe dieses Thema: stackoverflow.com/questions/275004/
0 Stimmen
@hap497 cool, aber was druckt es (und wie lange dauert es, wenn man es von Hand macht)?
0 Stimmen
Haben Sie schon einmal Folgendes gelesen open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2661.htm
0 Stimmen
Möchten Sie messen Wanduhr Zeit (Zeitpunkt des Prozessendes - Zeitpunkt des Prozessbeginns), oder wollen Sie messen verbrauchte CPU-Zeit ? (Die Wanduhrzeit kann ein Bruchteil der CPU-Zeit bei Multithreading sein, und die CPU-Zeit kann ein Bruchteil der Wanduhrzeit sein, wenn Ihr Prozess auf E/A wartet.) Hierfür müssen Sie verschiedene Funktionen verwenden. Für letzteres ist es am einfachsten, Ihren Prozess unter der Kontrolle der
time
(keine Änderung des Quellcodes erforderlich); dadurch erhalten Sie auch die Zeit, die der Kernel für die Verarbeitung der E/A des Prozesses benötigt.0 Stimmen
Sie erleben vielleicht die Microsoft Minute .
0 Stimmen
Wenn einfach ist das Wichtigste: $
time ./MyProgram
(nur Linux). Referenz: levelup.gitconnected.com/ .0 Stimmen
time(NULL)
hat ein Ergebnis in Sekunden. Wenn das Programm weniger als eine Sekunde dauert, sind Start- und Endzeit gleich lang. Das Ergebnis von timersub ist eine Struktur mit ganzzahligen Sekunden und ganzzahligen Mikrosekunden (siehe man7.org/linux/man-pages/man2/settimeofday.2.html ) Man könnte es also ausdrucken mitprintf("**time taken = %ld.%06ld\n", diff.tv_sec, diff.tv_usec);
0 Stimmen
Beachten Sie, dass
tv_usec
ist Mikrosekunden nicht Nanosekunden. Dieu
wird oft anstelle von (Kleinbuchstabe mu) verwendet, da es in ASCII (nicht erweitert) nicht verfügbar ist, daher "usec" anstelle von "s".