2012-06-21 48 views
5

在这里,我写了一个测试大约地方,成员,volatile成员的访问速度:为什么访问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)结果:

回合:1 空:5 当地:10 成员:312 VMember:33378

回合:2 空:31 本地:0 成员:294 VMember:33180

回合:3 空:0 本地:0 成员:306 VMember:33085

回合:4 空:0 本地:0 成员:300 VMember:33066

回合:5 空:0 本地:0 会员:303 VMember:33078

回合:6 空:0 本地:0 成员:299 VMember:33398

回合:7 空:0 本地:0 成员:305 VMember:33139

回合:8 空:0 本地:0 会员:307 VMember:33490

回合:9 空:0 本地:0 成员:350 VMember:35291

回合:10 空:0 本地:0 成员:332 VMember:33838

令我惊讶的是访问易失性构件比正常构件慢100倍。我知道有一些关于volatile成员的高亮功能,比如对它的修改会立即对所有线程都可见,访问点volatile变量扮演着“内存障碍”的角色。但是,所有这些副作用是否会成为100倍慢的主要原因?

PS:我也在Core II CPU机器上做过测试。大约9:50,大约慢了5倍。似乎这也与CPU拱有关。 5次还是很大的吧?

+0

可能重复的[Is volatile expensive?](http://stackoverflow.com/questions/4633866/is-volatile-expensive) –

+0

看着它... – DeepNightTwo

回答

3

使用volatile可以防止某些JIT优化。如果你的循环没有做任何事情,JIT可以优化这些循环(除非你有一个volatile字段),这一点尤其重要。如果你运行循环“long”,那么这个循环会增加更多。

在更实际的测试中,您可能会预计volatile对于cirtical代码的采样速度会降低30%到10倍。在大多数实际的程序中,它几乎没有什么区别,因为CPU足够聪明,可以“认识到”只有一个内核正在使用易失性字段并对其进行缓存,而不是使用主内存。

3

访问volatile变量会阻止CPU在访问前后重新排序指令,这通常会降低执行速度。

6

易失性成员永远不会被缓存,所以它们直接从主内存中读取。

+0

到底。为什么这不是被接受的答案。 –

相关问题