Ashish
Ashish

Reputation: 14707

Why second loop is faster than first

Why second loop is faster than first here.

public class Test2 {
    public static void main(String s[]) {
        long start, end;
        int[] a = new int[2500000];
        int length = a.length;
        start = System.nanoTime();
        for (int i = 0; i < length; i++) {
            a[i] += i;
        }
        end = System.nanoTime();
        System.out.println(end - start + " nano  with i < a.length ");
        int[] b = new int[2500000];
        start = System.nanoTime();
        for (int i = b.length - 1; i >= 0; i--) {
            b[i] += i;
        }
        end = System.nanoTime();
        System.out.println(end - start + " nano with i > = 0");
    }
}

Output is

6776766 nano  with i < a.length 
5525033 nano with i > = 0

update - I have update the question according to the suggestion but I still see the difference in time. first loop is taking more time then second loop.

Upvotes: 0

Views: 162

Answers (3)

Jonny Henly
Jonny Henly

Reputation: 4233

The main reason for the difference in times is -

"... Never use System.currentTimeMillis() unless you are OK with + or - 15 ms accuracy, which is typical on most OS + JVM combinations. Use System.nanoTime() instead." – Scott Carey Found Here

Update:
I believe someone mentioned in the comments section of your question that you should also warm up the kernel your testing on, before testing micro benchmarks.

Rule 1: Always include a warmup phase which runs your test kernel all the way through, enough to trigger all initializations and compilations before timing phase(s). (Fewer iterations is OK on the warmup phase. The rule of thumb is several tens of thousands of inner loop iterations.)

Upvotes: 1

Santa
Santa

Reputation: 11545

If I modified your first for loop slightly, you'll get a similar time:

    int alength = a.length;    // pre-compute a.length
    start = System.currentTimeMillis();
    for (int i = 0; i < alength; i++) {
        a[i] += i;
    }

$ java Test
8 millis with i<a.length 
6 millis with i>=0

Upvotes: 2

vlady
vlady

Reputation: 497

Most likely it's because you're fetching the value of a.length each iteration in the first case, as opposite to once in the second case.

try doing something like

int len = a.length;

and using len as the termination border for the loop.

this could potentially reduce the time of the first loop.

Upvotes: 3

Related Questions