为什么访问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