为什么访问volatile变量比成员慢100左右?

在这里,我编写了有关本地,成员,易失成员的访问速度的测试:

public class VolatileTest {

public int member = -100;

public volatile int volatileMember = -100;

public static void main(String[] args) {

int testloop = 10;

for (int i = 1; i <= testloop; i++) {

System.out.println("Round:" + i);

VolatileTest vt = new VolatileTest();

vt.runTest();

System.out.println();

}

}

public void runTest() {

int local = -100;

int loop = 1;

int loop2 = Integer.MAX_VALUE;

long startTime;

startTime = System.currentTimeMillis();

for (int i = 0; i < loop; i++) {

for (int j = 0; j < loop2; j++) {

}

for (int j = 0; j < loop2; j++) {

}

}

System.out.println("Empty:" + (System.currentTimeMillis() - startTime));

startTime = System.currentTimeMillis();

for (int i = 0; i < loop; i++) {

for (int j = 0; j < loop2; j++) {

local++;

}

for (int j = 0; j < loop2; j++) {

local--;

}

}

System.out.println("Local:" + (System.currentTimeMillis() - startTime));

startTime = System.currentTimeMillis();

for (int i = 0; i < loop; i++) {

for (int j = 0; j < loop2; j++) {

member++;

}

for (int j = 0; j < loop2; j++) {

member--;

}

}

System.out.println("Member:" + (System.currentTimeMillis() - startTime));

startTime = System.currentTimeMillis();

for (int i = 0; i < loop; i++) {

for (int j = 0; j < loop2; j++) {

volatileMember++;

}

for (int j = 0; j < loop2; j++) {

volatileMember--;

}

}

System.out.println("VMember:" + (System.currentTimeMillis() - startTime));

}

}

这是我的X220(I5 CPU)上的结果:

空:5本地:10成员:312 VM会员:33378

空:31本地:0成员:294 VM会员:33180

空:0本地:0成员:306 VM会员:33085

空:0本地:0成员:300 VM会员:33066

空:0本地:0成员:303 VMember:33078

空:0本地:0成员:299 VMember:33398

空:0本地:0成员:305 VMember:33139

空:0本地:0成员:307 VM会员:33490

空:0本地:0成员:350 VM会员:35291

空:0本地:0成员:332 VM会员:33838

令我惊讶的是,访问易失性成员的速度比普通成员慢100倍。我知道关于volatile成员有一些突出的功能,例如对它的修改将立即对所有线程可见,对volatile变量的访问点起着“内存屏障”的作用。但是所有这些副作用是否可能是慢100倍的主要原因?

PS:我还在Core II CPU机器上进行了测试。它大约是9:50,大约慢5倍。似乎这也与CPU架构有关。5倍还大吧?

回答:

接取volatile防止一些JIT

optimisaton。如果您的循环实际上并没有执行任何操作,那么这尤其重要,因为JIT可以优化此类循环(除非您具有可变字段)。如果将循环“长时间”运行,则损耗会增加更多。

在更实际的测试中,您可能希望volatile将Cirical代码的速度降低30%到10倍。在大多数实际程序中,这几乎没有什么区别,因为CPU足够智能,可以“意识到”只有一个内核在使用易失性字段并对其进行缓存,而不是使用主内存。

以上是 为什么访问volatile变量比成员慢100左右? 的全部内容, 来源链接: utcz.com/qa/403443.html

回到顶部