Pebble Coding

ソフトウェアエンジニアによるIT技術、数学の備忘録

C++11環境におけるatomic操作のパフォーマンス比較

C++11のatomic関数はどのくらいのパフォーマンスを出せるのか調べてみました。
short変数に対してスレッド2つを使い、スレッドAが書き込み、スレッドBが読み込みとします。

環境:
Intel Core i5 1.6GHz
コア数:2
2次キャッシュ(コアのキャッシュ):256KB
3次キャッシュ:3MB

結果です。
10万回の処理ループを20セット実行させた時の、最小値、最大値、平均の時間(マイクロ秒)です。

min max mean平均(microsec)
1) ロックなし (nonatomic) 748 us 989 us 909 us
2) std:atomic_short メモリオーダー memory_order_relaxed 1007 us 1533 us 1471 us
3) std:atomic_short メモリオーダー memory_order_acquire, memory_order_release 927 us 1448 us 1357 us
4) std:atomic_short メモリオーダー memory_order_seq_cst 1840 us 4317 us 3331 us
5) OSSpinLockでロック 2270 us 12944 us 4824 us
6) std::mutexでロック 414946 us 701541 us 626411 us

速度が2桁違いました。
ということで、std::mutexではなくatomic変数だけで済む処理はstd::atomicを使いましょう。

C++ Concurrency in Action

C++ Concurrency in Action