一个很简单的问题,但是却又不简单。之所以叫简单的问题是因为内容少,答案不简单是很多人回答不了。废话少说,上题:双重for循环效率问题,外面一千万次,里面一百次……
for(int i=0;i<10000000;i++)
for(int j=0;j<100;j++);for(int i=0;i<100;i++)
for(int j=0;j<10000000;j++);
大家看后说说哪个效率要高些还是说两个都是一样。我本人第一感觉是第一个要快些,后来一想是不是一样的呢?因为计算次数都相等,后来一实验,结果却出人意料。网上有人说下面的快,原因是因为跳的次数少,但是结果却相反,你怎么看呢?
for(int i=0;i<10000000;i++)
for(int j=0;j<100;j++);for(int i=0;i<100;i++)
for(int j=0;j<10000000;j++);
大家看后说说哪个效率要高些还是说两个都是一样。我本人第一感觉是第一个要快些,后来一想是不是一样的呢?因为计算次数都相等,后来一实验,结果却出人意料。网上有人说下面的快,原因是因为跳的次数少,但是结果却相反,你怎么看呢?
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
long sum = 0;
long startTime = System.nanoTime();
for (int i = 0; i < 10000000; i++)
for (int j = 0; j < 100; j++) {
sum += j;
}
long endTime = System.nanoTime();
System.out.println("方法一耗时:" + (endTime - startTime)); sum =0;
long startTime1 = System.nanoTime();
for (int i = 0; i < 100; i++)
for (int j = 0; j < 10000000; j++) {
sum += j;
}
long endTime1 = System.nanoTime();
System.out.println("方法二耗时:" + (endTime1 - startTime1));
}
}
下面是运行结果,单位是毫秒
方法一耗时:3279567707
方法二耗时:2946789382
int = 0;
long begin = System.currentTimeMillis();
for(int i=0;i<10000000;i++)
for(int j=0;j<100;j++){
++;
}
long use = System.currentTimeMillis()- begin;
System.out.println(use);
= 0;
long begin1 = System.currentTimeMillis();
for(int i=0;i<100;i++)
for(int j=0;j<10000000;j++){
++;
}
long use1 = System.currentTimeMillis()- begin1;
System.out.println(use1);在下是JDK1.6,这是执行结果:
1312
1469
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
long sum = 0;
for (int i = 0; i < 10000000; i++)
for (int j = 0; j < 100; j++) {
sum += j;
}
//以上代码先让jre热热身
sum = 0;
long startTime = System.nanoTime();
for (int i = 0; i < 10000000; i++)
for (int j = 0; j < 100; j++) {
sum += j;
}
long endTime = System.nanoTime();
System.out.println("方法一耗时:" + (endTime - startTime)); sum =0;
long startTime1 = System.nanoTime();
for (int i = 0; i < 100; i++)
for (int j = 0; j < 10000000; j++) {
sum += j;
}
long endTime1 = System.nanoTime();
System.out.println("方法二耗时:" + (endTime1 - startTime1));
}
}
测试结果:IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 Windows XP x86-32 j9vmwi3223ifx-20061016 (JIT enabled)
方法一耗时:26298606107
方法二耗时:28221543520IBM J9 VM (build 2.4, J2RE 1.6.0 IBM J9 2.4 Windows XP x86-32 jvmwi3260-20080816_22093 (JIT enabled, AOT enabled)
方法一耗时:14806
方法二耗时:7822Java HotSpot(TM) Client VM (build 1.5.0_17-b04, mixed mode, sharing)
方法一耗时:4369540263
方法二耗时:4234990481Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing)
方法一耗时:2188964240
方法二耗时:1931450785Oracle JRockit(R) (build R28.0.1-21-133393-1.6.0_20-20100512-2132-windows-ia32, compiled mode)
方法一耗时:4431655140
方法二耗时:4328235013
JRockit1.5没装,就没测试了,综上,IBM J91.5做这种循环效率最差,但是J9 1.6做了很好的优化,效率大大提高!另外,如果不给jre热身热身就直接测试是不对的,像sun hotspot jvm,它会在运行时做一些优化
long begin = System.nanoTime();
for(int i=0;i<10000000;i++)
for(int j=0;j<100;j++){
++;
}
long use = System.nanoTime()- begin;
System.out.println(use);
int = 0;
long begin = System.nanoTime();
for(int i=0;i<100;i++)
for(int j=0;j<10000000;j++){
++;
}
long use = System.nanoTime()- begin;
System.out.println(use);
1622690593 1624523508 1622771609
1497539212 1496512267 1494422615
14xx
12xx
jdk1.6
嘿~
方法一耗时:2965354815
方法二耗时:2895023809
long begin = System.currentTimeMillis();
for(int i=0;i<10000000;i++)
for(int j=0;j<100;j++){
++;
}
long use = System.currentTimeMillis()- begin;
System.out.println(use);
= 0;
long begin1 = System.currentTimeMillis();
for(int i=0;i<100;i++)
for(int j=0;j<10000000;j++){
++;
}
long use1 = System.currentTimeMillis()- begin1;
System.out.println(use1);
1453
13291500
13431468
1282
jdk1.6 三次的结果
CUP的调度,,,这都很难确定的
那我想问,java for循环和C for 循环高层原理一样,用C试一试,看看到底是不是两种双层for真的不同。