gpt4 book ai didi

Java For 循环 vs While 循环,奇怪的行为和时间性能

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:55:05 29 4
gpt4 key购买 nike

我正在编写一个算法,该算法对一个整数数组从末尾到开头执行一个大循环,其中包含一个 if 条件。第一次条件为假时,循环可以终止。

因此,对于 for 循环,如果条件为假,它会继续迭代并进行简单的变量更改。使用条件作为 while 参数的 while 循环,一旦条件为假,循环将停止并且应该节省一些迭代。

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

但是,如果我将一个 int 值作为计数器并计算迭代次数,For 循环将按预期执行更多次迭代。然而这次,带有计数器的修改后的 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() 方法更新增量值。方法 getDistance() 只是一个矩阵 int[][] 访问。

感谢您的帮助。

最佳答案

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

简而言之 - 运行一段时间后,启用 Hotspot 的 JVM 可以优化您的代码,这将影响测试结果。因此,您需要适当的技术来测试代码的性能。为了减轻痛苦,有一个用于执行适当测试的库:http://ellipticgroup.com/html/benchmarkingArticle.html您可以在此页面上找到文章两部分的链接。

更新:为了帮助您更快地开始,这里是您需要做的:

  1. 下载在 page 上找到的 bb.jar、jsci-core.jar、mt-13.jar
  2. 将它们放在类路径中
  3. 重写您的代码,以便 while 循环方法和 for 循环方法都分别实现 Runnable 或 Callable 接口(interface)
  4. 在你的主要方法中调用

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

显示 while 循环的执行时间,显然

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

获取for循环的信息

关于Java For 循环 vs While 循环,奇怪的行为和时间性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8183143/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com