Betrachten Sie das folgende Stück CodeZeitdifferenzen mit std :: Chrono :: System_Clock/std :: Chrono :: high_resolution_clock
#include <chrono>
#include <iostream>
#include <thread>
int main()
{
using std::chrono::system_clock;
using std::chrono::milliseconds;
using std::chrono::nanoseconds;
using std::chrono::duration_cast;
const auto duration = milliseconds(100);
const auto start = system_clock::now();
std::this_thread::sleep_for(duration);
const auto stop = system_clock::now();
const auto d_correct = duration_cast<nanoseconds>(duration).count();
const auto d_actual = duration_cast<nanoseconds>(stop - start).count();
std::cout << "Difference is " << d_actual << ", and it should be roughly " << d_correct << "\n";
}
Was wir erwarten, ist etwas auf der Linie der
Difference ist 100039989, und es sollte etwa 100000000 sein
Siehe this demo, wo es absolut gut funktioniert.
Allerdings sind auf meinem Rechner mehrere Compiler installiert, die nach this answer here on Stack Overflow eine Fehlkonfiguration zu verursachen scheinen.
Daher habe ich versucht, den vorgeschlagenen Fix: Einstellung der richtigen LD_LIBRARY_PATH
. Dies sind die Kombinationen mit Ausgang Ich habe versucht (ua mit 4.4 und 4.6 ...)
g++-4.7 time.cpp -pthread -std=c++11; LD_LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.7/ ./a.out
Difference 100126, und es sollte in etwa 100000000
g++-4.7 time.cpp -pthread -std=c++11; LD_LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.8/ ./a.out
sein Der Unterschied ist 100132, und es sollte ungefähr 100000000 sein.
g++-4.8 time.cpp -pthread -std=c++11; LD_LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.7/ ./a.out
Unterschied ist 100.085.953, und es sollte in etwa 100000000
Es scheint sein sein grob 100000000
g++-4.8 time.cpp -pthread -std=c++11; LD_LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.8/ ./a.out
Unterschied ist 100.156.418, und es sollte, dass egal wie, Kompilieren mit
g++-4.8
funktioniert gut mit einem derlibstdc++
, während die Kompilierung mitg++-4.7
führt zu einem gebrochenen sitzen .Mache ich etwas falsch hier im Compiler/Binär-Aufruf oder ist es ein Fehler in
g++-4.7
? (Es istg++-4.7.3
undg++-4.8.1
um genau zu sein)Für (die wahrscheinlich hässlichste) Workaround, kann ich natürlich für eine winzige Zeit messen, vergleichen Sie es mit dem erwarteten Unterschied und kommen mit einem Faktor. Allerdings würde ich das gerne elegant lösen.
Wenn es hilft, diese Seite erwähnt, dass die C++ 11 Uhr ABI in GCC 4.8.1 geändert: http://gcc.gnu.org/gcc-4.8/changes.html –
@JohnZwinck Dies ist wahrscheinlich verwandt, aber ich sehe nicht, wie ich die Situation mit 4.7 beheben kann (Ich möchte mindestens zwei Compiler-Versionen für das Produkt, an dem ich arbeite. Bei der Arbeit hat nur mein Dev-Rechner 4.8, alle anderen laufen <= 4.7) – stefan
GCC 4.7 hat keine 100% funktionierende Unterstützung für C++ 11, also * kann * kein Glück sein, oder zumindest einige fiese Workarounds benötigen. Ich bin mir nicht wirklich sicher, und war nicht in der Lage, einen spezifischeren Problembericht von der GCC-Seite auszugraben. –