Ein genaues Timing ist mir wichtig, und ich untersuchte die drei in C ++ 11 angegebenen Uhrentypen, nämlich system_clock
, steady_clock
und high_resolution_clock
.
Meine anfängliche Sorge war, zu prüfen, ob es irgendeinen Unterschied im Anruf-Overhead zu den verschiedenen Arten von Taktgebern gibt, und die Auflösung jeder Art von Taktgeber zu überprüfen.
Hier ist mein Beispielprogramm:
Ich kompiliere es mit
%Vor%Ich habe mit G ++ 4.7.2 kompiliert und es auf
ausgeführt Das erste Überraschende war, dass die drei Arten von Uhren scheinbar Synonyme sind. Sie alle haben die gleiche Periode (1 Mikrosekunde), und die Zeit / Anruf ist praktisch gleich. Was ist der Sinn, drei Arten von Uhren anzugeben, wenn sie alle gleich sind? Liegt das daran, dass die G ++ - Implementierung von chrono
noch nicht ausgereift ist? Oder hat der Kernel 3.1.10 nur eine vom Benutzer zugängliche Uhr?
Die zweite Überraschung, und das ist riesig, ist steady_clock :: is_steady == false . Ich bin ziemlich sicher, dass diese Eigenschaft per Definition wahr sein sollte. Was gibt?? Wie kann ich das umgehen (dh eine stabile Uhr erreichen)?
Wenn Sie das einfache Programm auf anderen Plattformen / Compilern ausführen können, wäre ich sehr an den Ergebnissen interessiert. Wenn sich jemand wundern wird, ist es etwa 25 ns / Iteration auf meinem Core i7 und 1000 ns / Iteration auf dem Tegra 2.
steady_clock
wird für GCC 4.7 unterstützt (wie in den Dokumenten für die Version 4.7 gezeigt: Ссылка ) und stead_clock::is_steady
ist wahr, aber nur, wenn Sie GCC mit --enable-libstdcxx-time=rt
Einzelheiten zu dieser Konfigurationsoption finden Sie Ссылка .
Bei GCC 4.9 wird es automatisch aktiviert, wenn Ihre Betriebssystem- und C-Bibliothek monochrome POSIX-Uhren für clock_gettime
unterstützt (was für GNU / Linux mit glibc 2.17 oder höher und für Solaris 10, IIRC gilt)
Hier sind die Ergebnisse mit GCC 4.8 konfiguriert mit --enable-libstdcxx-time=rt
auf einem AMD Phenom II X4 905e, 2.5GHz, aber ich denke, es ist derzeit auf 800MHz gedrosselt, mit Linux 3.6.11, glibc 2.15
Und mit GCC 4.7 ohne --enable-libstdcxx-time
(also die gleichen Ergebnisse für alle drei Uhrentypen) auf ARMv7 Exynos5 mit Linux 3.4.0, glibc 2.16
Wenn Sie das einfache Programm auf anderen Plattformen / Compilern ausführen können, I wäre sehr daran interessiert, die Ergebnisse zu wissen.
Mac OS X 10.8, Klang ++ / libc ++, -O3, 2.8 GHz Core i5:
%Vor% steady_clock
und system_clock
müssen unterschiedliche Typen sein. steady_clock::is_steady
muss true
sein. high_resolution_clock
kann ein eigener Typ oder ein Alias von steady_clock
oder system_clock
sein. system_clock::rep
muss ein signierter Typ sein.
Laut der GNU-Website wird GNU libstdc ++ nicht unterstützt steady_clock
noch nicht. Deshalb ist steady_clock::is_steady
falsch.
Hier ist der relevante Abschnitt der Support-Checkliste:
%Vor%