std::unordered_map
複数のスレッドから非常に読み取り負荷の高いワークロードを受けている があります。同期には astd::mutex
を使用できますが、同時読み取りは問題ないはずなので、boost::shared_mutex
代わりに a を使用したいと考えました。パフォーマンスの向上をテストするために、最初にマップに一連の値を事前入力してから、一連のスレッドに読み取りテストを実行させます。
for (int i = 0; i < iters; ++i) map.count(random_uint(0, key_max));
によって保護されている粗いロックの実装と、count
によって保護されstd::lock_guard<std::mutex>
ている共有ロックの実装に対して、これを実行しboost::shared_lock<boost::shared_mutex>
ます。
GCC 6.1.1 を搭載した私の Arch Linux x86_64 システムでは、boost::shared_lock
バージョンが常に遅くなります! MSVC 2013 を搭載した友人の Windows 10 システムでboost::shared_lock
は、常に高速です。
コンパイル可能な完全なコードは github にあります: https://github.com/silverhammermba/sanity
編集
これはプラットフォーム固有の問題のようです。上記を参照。他の誰かがこのコードをビルドして実行し、正の出力 (shared_lock
高速) または負の出力 (もちろんミューテックスの方が高速) を見たかどうか、および使用しているプラットフォームを報告していただければ幸いです。