我注意到以下两个循环花费相同的时间:约 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/