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

标签 java performance for-loop while-loop

我正在编写一个算法,该算法对一个整数数组从末尾到开头执行一个大循环,其中包含一个 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/

相关文章:

Java 交叉影线纹理

mysql - 使用许多子选择优化 MySQL 查询

swift - 如何为所有正在运行的应用程序添加监听器

r - 在连续行中查找值

java - Java 中内存分配的典型速度是多少?

matlab - 使用 MATLAB 计算 for 循环内的多个正弦曲线,然后绘制它们

java - 我们如何在页面工厂(@FindBy)中使用RelativeLocator(而不是Relative xpath)?

java - 如何在 java.Util.List<Type> 中按条件搜索元素?

java - 暂停线程以防止 ConcurrentModificationException?

performance - 无论方向如何,以恒定速度更新对象的位置