我正在编写一个算法,它在整个数组中从一端到另一端执行一个大循环,内部有一个if条件。在第一次条件为假时,可以终止循环。
因此,对于for循环,如果condition为false,则继续使用简单的变量进行迭代。 使用带有条件while参数的while循环,循环将在条件为false时停止并且应该保存一些迭代。
然而,while循环仍然比for循环慢一点!
但是,如果我将一个int值作为计数器,并计算迭代次数,For循环按预期执行了更多的迭代。 但是这次,使用计数器执行mofified For方法的时间比使用计数器的while方法慢得多!
有任何解释吗?
这里带有for循环的代码:
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
时间以毫秒计,我用不同大小的内容重复实验几次,措施几乎保持不变。 execute()方法更新delta值。方法getDistance()只是一个矩阵int [] [] access。
感谢您的帮助。
答案 0 :(得分:4)
在尝试对java执行任何性能测试之前,我强烈建议您阅读本文 http://www.ibm.com/developerworks/java/library/j-benchmark1/index.html
简而言之 - 当运行一段时间时,支持Hotspot的JVM可以优化您的代码,这将影响测试结果。因此,您需要使用适当的技术来测试代码的性能。 为了减轻痛苦,有一个用于执行适当测试的库:http://ellipticgroup.com/html/benchmarkingArticle.html 您可以在此页面找到本文两部分的链接。
更新:为了帮助您更快地启动,您只需要执行此操作:
System.out.println(new Benchmark(new WhileApproach()));
显示while循环的执行时间,显然是
System.out.println(new Benchmark(new ForApproach()));
获取for-loop的信息
答案 1 :(得分:1)
您没有相同的终止条件。对于while循环,它是:
duv > delta
和for循环它是
i >= 0
这两种情况并不相同。我的猜测是,while循环条件比for条件更快地变为false,因此它执行的迭代次数更少。
答案 2 :(得分:0)
当duv>delta
while循环停止时,for循环继续。两者都得到相同的结果,但for
继续检查。您应该像这样修改for循环:
if (duv > delta)
{
execute();
}
else break;