2011-11-18 97 views
3

我正在写一个算法,从里面到if条件从一个结束到一个整数数组做一个大循环。在条件错误的第一次,循环可以终止。Java For循环vs While循环,奇怪的行为和时间表现

因此,使用for循环,如果条件为false,它将继续使用简单变量更改进行迭代。 使用while参数作为条件,while循环将在条件为false时停止,并应保存一些迭代。

但是,while循环仍然比for循环慢一点!

但是,如果我把一个int值作为计数器,并对迭代进行计数,For循环如预期的那样执行更多的迭代。 但是这一次,使用计数器的mofified For方法的执行时间将比使用计数器的while方法慢得多!

任何解释?

这里用的代码循环:

for (int i = pairs.length - 1; i >= 0; i -= 2) { 
    //cpt++; 
    u = pairs[i]; 
    v = pairs[i - 1]; 

    duv = bfsResult.distanceMatrix.getDistance(u, v); 

    if (duv > delta) { 
     execute(); 
    } 
} 

时间执行:6473
时间执行与抗衡:8299个
迭代计数:2584401

在这里与while循环的代码:

int i = pairs.length - 1; 

u = pairs[i]; 
v = pairs[i - 1]; 

duv = bfsResult.distanceMatrix.getDistance(u, v); 

while (duv > delta) { 
    //cpt++; 
    execute(); 

    u = pairs[i -= 2]; 
    v = pairs[i - 1]; 
    duv = bfsResult.distanceMatrix.getDistance(u, v); 
} 

执行时间:6632
时间执行与抗衡:7163
迭代计算:9793

时间是毫秒,我有不同的大小intances多次反复实验,这些措施几乎保持不变。 execute()方法更新增量值。方法getDistance()只是一个矩阵int [] []访问。

感谢您的任何帮助。

+1

你可以用两个循环完成同样的事情。例如::你可以在duv <= delta'时打开for循环。 –

+0

你用什么单位进行时间测量?毫秒?如果是这样,我认为你正在寻找一个微基准问题。 –

+0

我同意,我的问题是为什么时间几乎与while循环相同,因为它正在做更多的迭代。为什么当我把一个简单的柜台变得更“正常”? –

回答

4

之前您尝试执行java的任何性能测试中,我强烈建议你阅读这篇文章 http://www.ibm.com/developerworks/java/library/j-benchmark1/index.html

几句话 - 一段时间热点启用JVM可以优化你的代码,这将影响到结果上运行时的测试。所以你需要正确的技术来测试你的代码的性能。 为了缓解疼痛,有一个库用于执行适当的测试:http://ellipticgroup.com/html/benchmarkingArticle.html 您可以在本页找到本文两部分的链接。

更新:帮助您开始使用此这里更快是你只需要做:

  1. 下载bb.jar,jsci-core.jar添加,MT-13。在page
  2. 发现罐子它们放在classpath中
  3. 重写代码,以便while循环方式和循环方式无论是在Runnable或Callable接口
  4. 的不同实现走在main方法只是调用

System.out.println(new Benchmark(new WhileApproach()));

,以示对while循环的执行时间和明显

System.out.println(new Benchmark(new ForApproach()));

以获取for循环

+0

谢谢,我会看! –

+0

@Aurélien更新了答案 - 如果你觉得厌倦过度的理论,请快速浏览一下;) –

+0

非常感谢,这不能简单! –

0

duv>delta while循环停止的信息,但for循环仍在继续。两者都得到相同的结果,但for继续检查。您应该像这样修改for循环: if (duv > delta) { execute(); } else break;

+0

你没有正确地阅读这个问题。 for循环实际上**比while循环更快**,即使它执行更多的intections。 – Antoine

1

您没有相同的终止条件。对于while循环是:

duv > delta 

和for循环是

i >= 0 

这两个方案是不等价的。我的猜测是,while循环条件变得比for条件更快,因此它执行的迭代次数更少。

+0

是的,确切地说,为什么for循环比while循环快得多? –