高速缓存位于在CPU和主内存之间,是一个速度更快的内存模块,其总体目的是提升性能。
缓存通常是由具有不同大小和访问时间的几个层次级别组成。L1缓存是最小和最快的。L2更大而更慢。L3更大甚至更慢-但仍然比主内存快得多。用于特定数据结构的数据量越少,将其放入高速缓存的机会就越大,从而可以显着提高性能。
volatile关键字之所以特殊,是因为volatile关键字不缓存变量的值,并且始终从主内存中读取变量。这意味着它不使用CPU缓存,因为它是为了线程安全。
原文点击标题,测试案例:
@State(Scope.Thread)
public class JMHArrayBenchmarking {
private static final int ARRAY_SIZE = 64 * 1024 * 1024;
public Integer[] array;
public volatile Integer[] vArray;
@Setup
public void setup() {
array = new Integer[ARRAY_SIZE];
vArray = new Integer[ARRAY_SIZE];
Arrays.fill(array, 1);
Arrays.fill(vArray, 1);
}
@TearDown
public void cleanup() {
array = new Integer[ARRAY_SIZE];
vArray = new Integer[ARRAY_SIZE];
}
@Benchmark
@BenchmarkMode(Mode.SingleShotTime)
public void doMultiply() {
for (int i = 0; i < array.length; i++) {
array[i] = array[i] * 3;
}
}
@Benchmark
@BenchmarkMode(Mode.SingleShotTime)
public void doVolatileMultiply() {
for (int i = 0; i < vArray.length; i++) {
vArray[i] = vArray[i] * 3;
}
}
}
|
在上面的示例中,说明了doMultiply()将元素插入到普通数组中的方法以及doVolatileMultiply()将元素插入到volatile数组中的方法。通过比较两种方法的速度,我们可以看到该doVolatileMultiply()方法的执行速度比该doMultiply()方法慢,因为volatile关键字不使用CPU缓存来存储元素。它直接从主内存中获取元素,这是为了线程安全。
结果:
Benchmark Mode Score Units
JMHArrayBenchmarking.doMultiply ss 0.529 s/op
JMHArrayBenchmarking.doVolatileMultiply ss 0.570 s/op
|