`
tanghui
  • 浏览: 7386 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

请问这两个循环的性能那个好些?

J# 
阅读更多
求:
for(int i = 100000; i > 0; i–) {}
for(int i = 1; i < 100001; i++) {}
这两个FOR循环哪个执行得更快?


我个人的测试方法为下面的方法,不知道对不对,请高手指教


public class Test {

	/**
	 * @param args
	 */
		static int num = 100000;

		  public static void main(String[] args) {

		    long begin = System.currentTimeMillis();
		    System.out.println("第一种情况开始:"+begin);
		    for (int i = 0; i < num+1; i++) {
		    	
		    }
		    long end = System.currentTimeMillis();
		    System.out.println("第一种情况结束:"+ end);
		    System.out.println("第一种开始和结束的时间差情况:"+ (end - begin));
		    
		    begin = System.currentTimeMillis();
		    System.out.println("第二种情况开始:"+ begin);
		    for (int i = num; i >0; i--) {

		    }
		    end = System.currentTimeMillis();
		    System.out.println("第二种情况结束:"+begin);
		    System.out.println("第二种开始和结束的时间差情况:"+ (end - begin));

		  }

}



运行结果:
第一种情况开始:1268831446250
第一种情况结束:1268831446250
第一种开始和结束的时间差情况:0
第二种情况开始:1268831446250
第二种情况结束:1268831446250
第二种开始和结束的时间差情况:0
1
1
分享到:
评论
3 楼 pouyang 2010-08-28  
下面是编译后的代码
主要区别在于
if_icmpge 15 (+9)  
iinc 1 by 1 


ifle 37 (+9)
iinc 1 by 255 

的区别,其他似乎没什么区别 
2 楼 pouyang 2010-08-28  
 public class D {

	public static void main(String[] args) {
		for ( int j = 0; j < 10000 ; j++ )
		{
		}
		System.out.println("------------");
		for ( int i = 10000; i > 0 ; i -- )
		{
		}
	}
}




0 iconst_0
 1 istore_1
 2 iload_1
 3 sipush 10000
 6 if_icmpge 15 (+9)
 9 iinc 1 by 1
12 goto 2 (-10)
15 getstatic #2 <java/lang/System.out>
18 ldc #3 <------------>
20 invokevirtual #4 <java/io/PrintStream.println>
23 sipush 10000
26 istore_1
27 iload_1
28 ifle 37 (+9)
31 iinc 1 by 255
34 goto 27 (-7)
37 return
1 楼 Curapica 2010-03-19  
这个在C里面是第一种快的,好像是编译成的二进制的,从汇编中看出的原因,信号的问题。java不清楚了,应该是差不多。 记得以前看到的《大内高手系列》里面提过

相关推荐

Global site tag (gtag.js) - Google Analytics