突然想到一个经常遇到的 循环中的条件判断问题, 就实验了一下, 结果很让人不解, 请看下面代码
第一部分, 循环中写不写else 效率相差相差 40% , 按理说,第一种写法比第二种判断次数还多了一次 ,结果却比第二种快很多
如果去掉 那个 else , 两种写法就相同了, 运行时间也相同
高手解答
public static void main(String[] args) {
int count = 100000000; //循环次数
// 第一部分
long start1 = System.currentTimeMillis();
for(int i = 0; i< count; i++){
if(i == 1000){
}
if(i == 2000){
}
}
long end1 = System.currentTimeMillis();
System.out.println(end1 - start1);
// 第二部分
long start2 = System.currentTimeMillis();
for(int i = 0; i< count; i++){
if(i == 1000){
}
else //此处else 写与不写 效率相差很大
if(i== 2000){
}
}
long end2 = System.currentTimeMillis();
System.out.println(end2 - start2);
}结果:
119
173
第一部分, 循环中写不写else 效率相差相差 40% , 按理说,第一种写法比第二种判断次数还多了一次 ,结果却比第二种快很多
如果去掉 那个 else , 两种写法就相同了, 运行时间也相同
高手解答
public static void main(String[] args) {
int count = 100000000; //循环次数
// 第一部分
long start1 = System.currentTimeMillis();
for(int i = 0; i< count; i++){
if(i == 1000){
}
if(i == 2000){
}
}
long end1 = System.currentTimeMillis();
System.out.println(end1 - start1);
// 第二部分
long start2 = System.currentTimeMillis();
for(int i = 0; i< count; i++){
if(i == 1000){
}
else //此处else 写与不写 效率相差很大
if(i== 2000){
}
}
long end2 = System.currentTimeMillis();
System.out.println(end2 - start2);
}结果:
119
173
解决方案 »
- java线程问题
- 在Java小应用程序中如何开启新线程
- byte c=(byte)200;溢出了,怎么转换200成byte类型阿?
- 小弟相求,麻烦大哥帮我看一下Collections.sort()排序,为什么有错呢?
- 这样的乱码谁知道怎么解决?
- 关于applet中显示swing的问题
- 小小麻烦,请帮忙!!谢谢!!!!!
- 请给一点对话框输入参数的例子。
- 菜鸟问路:关于Applet在IE中预览的问题(important!!)
- 麻烦大家帮我看一个IndexOutException的问题。。。我实在弄不明白是怎么会事情
- sort后fill然后binarySearch
- dom4j为什么比JDOM更高效? 两者不都是生成一颗xml文档树么?
然后else内部的if又要执行count-1次。第二次消耗的时间片多大概50%。
是这样,第二种方法多出的时间 应该是消耗在 else 身上的, 但是为什么 这个else 会这么耗时?
本身有什么特殊的 ? 如果这样, 以后 还不如不写这个 else
至于else之后再判断i等于2000,确实没必要。
if(i == 1000){
}
if(i == 2000){
}
两次判断条件互斥,没有相关性,完全可以不用else
运行速度慢的机子,加了else增加效率。
两个 if () 必然会条件互斥, 但我加了 else 明明减少了一次判断, 时间却在增加
如果说加上else 有一个 跳转 需要耗时 , 这个说法能说通 ,并且 去掉 else 里面判断之后 耗时和判断两次差不多
所以else关键字 本事 耗时相当于一次判断 ,真是奇怪
多了好多cpu指令
时间肯定更多些不过都基本可以忽略