次のコードを検討してください
#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";
}
私たちが期待しているのは、
差は 100039989 で、およそ 100000000 のはずです
完全に正常に動作するこのデモを参照してください。
ただし、私のマシンには、スタックオーバーフローのこの回答によると、構成不良を引き起こすと思われるコンパイラがいくつかインストールされています。
したがって、私は提案された修正を試みました: 正しいLD_LIBRARY_PATH
. これらは私が試した出力との組み合わせです(特に4.4と4.6で...)
g++-4.7 time.cpp -pthread -std=c++11; LD_LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.7/ ./a.out
差は 100126 で、およそ 100000000 のはずです
g++-4.7 time.cpp -pthread -std=c++11; LD_LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.8/ ./a.out
差は 100132 で、およそ 100000000 のはずです
g++-4.8 time.cpp -pthread -std=c++11; LD_LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.7/ ./a.out
差は 100085953 で、およそ 100000000 のはずです
g++-4.8 time.cpp -pthread -std=c++11; LD_LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.8/ ./a.out
差は 100156418 で、およそ 100000000 のはずです
g++-4.8
いずれにせよ、 を使用してコンパイルすると正常に動作しますが、 を使用してlibstdc++
コンパイルすると問題がg++-4.7
発生するようです。
ここでコンパイラ/バイナリの呼び出しで何か間違ったことをしていますか、それともバグg++-4.7
ですか? (それはg++-4.7.3
、g++-4.8.1
具体的には)
(おそらく最も醜い) 回避策として、もちろん、ごくわずかな時間を測定し、それを予想される差と比較して、要因を考え出すことができます。しかし、私はこれをエレガントに解決したいと思っています。