gpt4 book ai didi

nested-loops - 嵌套循环的效率

转载 作者:行者123 更新时间:2023-12-04 10:22:02 25 4
gpt4 key购买 nike

请参见以下代码段:

    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/

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