java - 有空主体和没有空主体的 For 循环花费相同的时间

标签 java performance for-loop

我注意到以下两个循环花费相同的时间:约 1.2 秒。

double count = Math.pow(10, 9);
for (int i = 0; i < count; i++) {
    int y = 10;
    int x = 3*y;
    x = 100*y;
    int[] arr = new int[3];
    arr[0] = 1;
}
double count = Math.pow(10, 9);
for (int i = 0; i < count; i++) {
    //nothing
}

为什么他们会同时完成?这些 for 循环仅递增并进行 1 次比较,因此每次迭代有 2 个操作。我认为第一个需要大约 3 倍的时间才能完成,因为它执行 7 个操作,而第二个执行 2 个操作。

最佳答案

答案不是因为优化(或仅仅因为优化 - 生成了字节码)。这是因为该循环是浮点循环,并且浮点运算的成本非常昂贵。因此,内部代码相对较快或对整体运行时间而言无关紧要(正如 @j11john 所提到的)。

如果您更改循环使其基于 int,则这两种形式将以显着不同的速度运行。

        long start = System.nanoTime();
        int count = (int)Math.pow(10, 9);
        int x = 0;
        for(int i = 0;i<count;i++) {
            int y = 10;
             x = 3*y;
            x = 100*y*x;
            int[] arr = new int[3];
            arr[0] = 1;
        
        }
        System.out.println((System.nanoTime()-start)/1_000_000_000.);
    }

8.4248E-5 与 0.047076639 后者使用额外的代码。

因此,两个运行时间的相似性(如运算符(operator)所观察到的)与循环的性质有关(int 与 double),并且与循环内的代码关系不大。

关于java - 有空主体和没有空主体的 For 循环花费相同的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64018008/

相关文章:

c - 在 for 循环中有效地打印每 x 次迭代

java - android sqlite 异常 : column 'satze' does not exist

java - 无法从命令行运行 JUnit 测试用例

java - 如何将 ObservableList 转换为 ObservableSet

java - JavaScript 和 Java 默认支持 REST 还是我需要安装新软件?

python - 高效地迭代 pandas.DataFrame,同时一次访问多个索引行

performance - CALayer性能问题: animating a line anchored between two UIViews

javascript - 为什么这个特定的 Javascript 循环只在重新分配变量时有效?

python - 使用 for/while 循环编写 filter() 函数

java - 在java中计算平均值