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を使いましょう。
- 作者: Anthony Williams
- 出版社/メーカー: Manning Publications
- 発売日: 2019/02/10
- メディア: ペーパーバック
- この商品を含むブログを見る