C ++ 11 Takte: g ++ steady_clock :: is_steady == false?

8

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:

%Vor%

Ich kompiliere es mit

%Vor%

Ich habe mit G ++ 4.7.2 kompiliert und es auf

ausgeführt
  • SUSE Linux, Kernel v3.1.10, CPU i7
  • Angstrom Linux Embedded System, Kernel v3.1.10, MCU Tegra 2 (ARM Cortex A9).

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.

    
Nicu Stiurca 22.02.2013, 20:13
quelle

3 Antworten

8

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

erstellen

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

%Vor%

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

%Vor%     
Jonathan Wakely 22.02.2013, 21:58
quelle
7
  

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.

    
Howard Hinnant 22.02.2013 20:23
quelle
4

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%     
Dirk Holsopple 22.02.2013 20:34
quelle

Tags und Links