Try*_*ing 12 java arrays complexity-theory
我在java中查看一个项目,发现一个for
循环,如下所示:
for(int i=1; i<a.length; i++)
{
...........
...........
...........
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:计算a.length
(这里是数组名称)是否代价高昂?如果没有那么如何a.length
在内部计算(意味着JVM如何确保O(1)访问它)?是类似于:
int length = a.length;
for(int i=1; i<length; i++)
{
...........
...........
...........
}
Run Code Online (Sandbox Code Playgroud)
就像访问函数内部的局部变量值一样.谢谢.
a.length
不是计算,而只是访问阵列中保存的字段.这种类型的读操作非常快.
如果代码是经常被调用的方法的一部分,那么几乎可以肯定JIT编译器会进行您建议的优化,以使其更快.
潜在的速度差在这里是纳秒(可能没有"s").
为了您的方便,我对其进行了微基准测试。代码:
public class ArrayLength
{
static final boolean[] ary = new boolean[10_000_000];
static final Random rnd = new Random();
@GenerateMicroBenchmark public void everyTime() {
int sum = rnd.nextInt();
for (int i = 0; i < ary.length; i++) sum += sum;
}
@GenerateMicroBenchmark public void justOnce() {
int sum = rnd.nextInt();
final int length = ary.length;
for (int i = 0; i < length; i++) sum += sum;
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
Benchmark Mode Thr Cnt Sec Mean Mean error Units
o.s.ArrayLength.everyTime thrpt 1 3 5 40215.790 1490.800 ops/msec
o.s.ArrayLength.justOnce thrpt 1 3 5 40231.192 966.007 ops/msec
Run Code Online (Sandbox Code Playgroud)
摘要:没有可检测到的变化。