Why is access to a mutable variable about 100 slower than a member?

Here I wrote a test about the access speed of a local, member, mutable member:

public class VolatileTest {

public int member = -100;

public volatile int volatileMember = -100;

public static void main(String[] args) {
    int testloop = 10;
    for (int i = 1; i <= testloop; i++) {
        System.out.println("Round:" + i);
        VolatileTest vt = new VolatileTest();
        vt.runTest();
        System.out.println();
    }
}

public void runTest() {
    int local = -100;

    int loop = 1;
    int loop2 = Integer.MAX_VALUE;
    long startTime;

    startTime = System.currentTimeMillis();
    for (int i = 0; i < loop; i++) {
        for (int j = 0; j < loop2; j++) {
        }
        for (int j = 0; j < loop2; j++) {
        }
    }
    System.out.println("Empty:" + (System.currentTimeMillis() - startTime));

    startTime = System.currentTimeMillis();
    for (int i = 0; i < loop; i++) {
        for (int j = 0; j < loop2; j++) {
            local++;
        }
        for (int j = 0; j < loop2; j++) {
            local--;
        }
    }
    System.out.println("Local:" + (System.currentTimeMillis() - startTime));

    startTime = System.currentTimeMillis();
    for (int i = 0; i < loop; i++) {
        for (int j = 0; j < loop2; j++) {
            member++;
        }
        for (int j = 0; j < loop2; j++) {
            member--;
        }
    }
    System.out.println("Member:" + (System.currentTimeMillis() - startTime));

    startTime = System.currentTimeMillis();
    for (int i = 0; i < loop; i++) {
        for (int j = 0; j < loop2; j++) {
            volatileMember++;
        }
        for (int j = 0; j < loop2; j++) {
            volatileMember--;
        }
    }
    System.out.println("VMember:" + (System.currentTimeMillis() - startTime));

}
}

And here is the result of my X220 (I5) processor:

Round: 1 Empty: 5 Local: 10 Member: 312 VMember: 33378

Round: 2 Empty: 31 Local: 0 Member: 294 VMember: 33180

Round: 3 Empty: 0 Local: 0 Member: 306 VMember: 33085

Round: 4 Empty: 0 Local: 0 Member: 300 VMember: 33066

Round: 5 Empty: 0 Local: 0 Member: 303 VMember: 33078

Round: 6 Empty: 0 Local: 0 Member: 299 VMember: 33398

Round: 7 Empty: 0 Local: 0 Member: 305 VMember: 33139

Round: 8 Empty: 0 Local: 0 Member: 307 VMember: 33490

Round: 9 Empty: 0 Local: 0 Member: 350 VMember: 35291

Round: 10 Empty: 0 Local: 0 Member: 332 VMember: 33838

, 100 . , - , , , " ". 100- ?

PS: Core II. 9:50, 5 . , . 5 - , ?

+5
3

Acess to volatile JIT. , , , JIT ( ). "long", .

, volatile 30% 10 cirtical . , , "", ​​ volatile , .

+3

, .

+6

Access to a variable volatileprevents the CPU from reordering instructions before and after access, and this usually slows down execution.

+3
source

All Articles