Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

time complexity or hidden cost of <Array Name>.length in java

I was looking at a project in java and found a for loop which was written like below:

for(int i=1; i<a.length; i++)
{
    ...........
    ...........
    ...........
}

My question is: is it costly to calculate the a.length (here a is array name)? if no then how a.length is getting calculated internally (means how JVM make sure O(1) access to this)? Is is similar to:

int length = a.length;
for(int i=1; i<length; i++)
{
    ...........
    ...........
    ...........
}

i.e. like accessing a local variable's value inside the function. Thanks.

like image 308
Trying Avatar asked Aug 01 '13 15:08

Trying


2 Answers

For your convenience, I've microbenchmarked it. The code:

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;
  }
}

The results:

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

Summary: no detectable change.

like image 112
Marko Topolnik Avatar answered Sep 19 '22 17:09

Marko Topolnik


a.length is not a calculation but merely an access to a field held within the array. That type of read operation is super fast.

If the code is part of a method which is called often enough, it is almost certain that the JIT compiler will do the optimisation you propose to make it even faster.

The potential speed difference is in nanoseconds here (probably without an "s").

like image 41
assylias Avatar answered Sep 17 '22 17:09

assylias