| JAVA世纪网 | 老紫竹的家 | 老紫竹的专栏 | 老紫竹的博客园 | 老紫竹的BlogJava |
随笔 - 3  文章 - 4  trackbacks - 0
<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(1)

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 1 /**
 2  * 测试For里变量对性能的影响;
 3  *
 4  * @author 老紫竹(laozizhu.com)
 5  */
 6 public class TestFor {
 7   static int num = 100000000;
 8 
 9   public static void main(String[] args) {
10 
11     long begin = System.currentTimeMillis();
12     for (int i = 0; i < num; i++) {
13 
14     }
15     long end = System.currentTimeMillis();
16     System.out.println(end - begin);
17 
18     // 测试间接的属性
19     // 影响很大
20     A a = new A();
21     begin = System.currentTimeMillis();
22     for (int i = 0; i < a.b.c.d.length; i++) {
23 
24     }
25     end = System.currentTimeMillis();
26     System.out.println(end - begin);
27 
28     // 测试直接的属性
29     // 无影响
30     D d = new D();
31     begin = System.currentTimeMillis();
32     for (int i = 0; i < d.length; i++) {
33 
34     }
35     end = System.currentTimeMillis();
36     System.out.println(end - begin);
37   }
38 
39   static class A {
40     B b = new B();
41   }
42 
43   static class B {
44     C c = new C();
45   }
46 
47   static class C {
48     D d = new D();
49   }
50 
51   static class D {
52     int length = num;
53   }
54 }


运行结果
78
344
78


可见,如果只是简单的 a.length, 那么与 len = a.length 直接用len没有区别
但如果是多级,则有较大的影响了。
posted on 2009-03-27 07:20 老紫竹 阅读(1646) 评论(3)  编辑  收藏

FeedBack:
# re: 关于for里面使用变量对性能的影响 2009-03-27 10:22 测试
因为在这句之前:for (int i = 0; i < a.b.c.d.length; i++) {
虚拟机已经将类A加载,类B,类C,类D都还没加载,只有在调用a.b,进行符号解析的时候才会加载类B,其它同理
类加载完还有初始化过程,加载,连接,初始化,符号解析都要花费时间  回复  更多评论
  
# re: 关于for里面使用变量对性能的影响 2009-03-27 10:45 yesman
从字节码上看
情况一是1个getstatic num
二是aload a;然后是4个getfield
三是aload d;然后1个getfield

再看结果,1,3情况差不多,说明getstatic和getfield的性能是差不多的,2的话执行了4次,自然要慢2-4倍,结果也验证了这点  回复  更多评论
  
# re: 关于for里面使用变量对性能的影响 2009-03-27 12:31 Johnny Jian
这样的测试很有问题,因为JVM都还没有warmup够
建议你看看这篇文章:http://www.ibm.com/developerworks/cn/java/j-benchmark1.html?ca=drs-cn-0709  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: