nested-loops - 嵌套循环的效率

标签 nested-loops

请参见以下代码段:

    Long first_begin = System.currentTimeMillis();

    // first nested loops
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 1000000; j++) {
            // do some stuff
        }
    }
    System.out.println(System.currentTimeMillis() - first_begin);
    // second nested loops
    Long seconde_begin = System.currentTimeMillis();
    for (int i = 0; i < 1000000; i++) {
        for (int j = 0; j < 10; j++) {
            // do some stuff
        }
    }
    System.out.println(System.currentTimeMillis() - seconde_begin);

我想知道为什么第一个嵌套循环的运行速度比第二个慢?

问候!

重要说明! :很抱歉,当我第一次提出此问题时,我无意中使变量j以1开头,我已进行了更正。

更新:循环中没有任何特定的逻辑,我只是​​在做一些测试,实际上这是在面试中提出的一个问题,面试官提示我更改循环的顺序以获得更好的性能。顺便说一句,我正在使用JDK1.5。经过一些测试之后,我现在更加困惑了,因为程序的结果不一致-有时第一个循环的运行速度比第二个循环快,但是大多数时候它的运行速度比第二个循环慢。

最佳答案

这个答案是针对更新后的问题的:

  • 如果访问的是二维数组,例如int[][],则内部循环中值较大的数组应该较慢。数量不多,但仍然如此。为了稍微理解该问题,请在Joel的一篇博客文章中阅读有关Shlemiel the street painter的信息。
  • 得到不一致结果的原因是您没有执行任何JVM预热。 JVM会不断分析运行的字节码并对其进行优化,通常只有经过30到50次迭代后,JVM才能以最佳速度运行。是的,这意味着您首先需要运行该代码数十次,然后再通过平均另外几十次运行进行基准测试,因为Garbage Collector会减慢两次运行的速度。
  • 一般说明,使用Long对象而不是long原语只是愚蠢的,JVM最有可能通过将其替换为原语来优化它,如果可以的话,如果不能,则注定会有一些(尽管非常小)恒定的速度降低使用它。
  • 关于nested-loops - 嵌套循环的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2550827/

    相关文章:

    Javascript - 如何使用数组和对象迭代嵌套数组以及为什么我的代码不起作用?

    c - 识别索引 vector 上的循环;制作 list ,减去旋转

    java - 使用循环在 Java 中制作表格

    java - 使用 Java 打印 1-100 之间的完美数字

    Java 国家数组

    hadoop - Hadoop Reducer无法处理嵌套循环计算?

    java - 使用嵌套循环根据数字陷入缩进空格

    php - 添加小计 PHP foreach 循环

    javascript - 带有嵌套数组的微模板

    java - Range 类的这种实现有什么问题