#概要
volatileを使用した際の性能影響について検証したメモページ。
#volatileとは
フィールドに付ける修飾子。
マルチスレッドのプログラムの場合に、スレッドがフィールドの値をキャッシュする可能性がある。
volatileを付けると、キャッシュの対象外にすることができる。
(本ページではvolatileの役割についての詳細は割愛。)
#性能検証
##性能検証に使用した環境
マシンスペック
CPU:Intel(R) Core(TM) i5-2400S CPU
RAM:8GB
OS:windows10 64ビット
実行環境
Eclipse(2020-03 (4.15.0))
Java8
##volatileを使用した場合の性能
volatileを付与した状態で、int型のフィールドを1億回カウントアップする処理の時間を計測。
private volatile int cnt = 0;
private long exe() {
long start = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
this.cnt++;
}
long end = System.currentTimeMillis();
return end - start;
}
上記のコードでの計測を10回実施し、平均値を取得。
結果
平均値:964ms
##volatileを使用しない場合の性能
上記のコードから、フィールドをvolatileを使用しない形に変更。
private int cnt = 0;
同様に計測を10回実施し、平均値を取得。
結果
平均値:7ms
#まとめ
volatileを使用した場合のほうが性能が悪くなるが、1億回カウントアップで上記程度の時間であるため、ほとんどの場合は影響なさそう。