今日私はミューテックスの性能をテストするコードを書いています。なぜboost :: mutexはvs2013のstd :: mutexより速いのですか?
これはO2の最適化とVS2010でコンパイルブースト(1.54)バージョン、次のとおりです。
boost::mutex m;
auto start = boost::chrono::system_clock::now();
for (size_t i = 0; i < 50000000; ++i) {
boost::lock_guard<boost::mutex> lock(m);
}
auto end = boost::chrono::system_clock::now();
boost::chrono::duration<double> elapsed_seconds = end - start;
std::cout << elapsed_seconds.count() << std::endl;
そして、これはあまりにもO2の最適化と、VS2013でコンパイルSTDバージョン、次のとおりです。
std::mutex m;
auto start = std::chrono::system_clock::now();
for (size_t i = 0; i < 50000000; ++i) {
std::lock_guard<std::mutex> lock(m);
}
auto end = std::chrono::system_clock::now();
std::chrono::duration<double> elapsed_seconds = end - start;
std::cout << elapsed_seconds.count() << std::endl;
ちょっと違うけど、まったく同じことをしている。 私のCPUはIntel Core i7-2600K、私のOSはWindows 7 64bit、 で、結果は0.7020sと2.1684s、3.08回です。
boost :: mutexは最初に を試し、失敗した場合は大きなチーズWaitForSingleObjectが2番目になります。 これは理解しやすいです。
VS2013のstd :: mutexははるかに複雑なようですが、私はすでに を理解しようとしましたが、私はポイントを得ることができませんでした なぜそれがとても複雑ですか?そこにはもっと速い方法がありますか?
どちらの場合でも最適化を有効にしてビルドしていますか(Visual Studioの場合はリリースビルド)? –
もちろん、/ O2最適化を伴うデフォルトのリリースビルドです。 – amanjiang
OK - 知っておいて欲しいのは、コンパイラの最適化を有効にするだけで、どれだけのパフォーマンス上の問題が簡単に「修正」されているのか驚いています。 –