Почему доступ к volatile-переменной примерно в 100 раз медленнее, чем к члену?

Здесь я написал тест на скорость доступа локального, членского, изменчивого члена:

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

}
}

И вот результат на моем X220 (I5 CPU):

Round:1 Пусто:5 Местный:10 Участник:312 VMember:33378

Раунд:2 Пусто:31 Местный:0 Участник:294 VMember:33180

Раунд:3 Пусто:0 Местный:0 Участник:306 VMember:33085

Раунд:4 Пусто:0 Местный:0 Участник:300 VMember:33066

Раунд:5 Пусто:0 Местный:0 Участник:303 VMember:33078

Раунд:6 Пусто:0 Местный:0 Участник:299 VMember:33398

Раунд:7 Пусто:0 Местный:0 Участник:305 VMember:33139

Раунд:8 Пусто:0 Местный:0 Участник:307 VMember:33490

Раунд:9 Пусто:0 Местный:0 Участник:350 VMember:35291

Раунд:10 Пусто:0 Местный:0 Участник:332 VMember:33838

Меня удивило, что доступ к volatile-члену в 100 раз медленнее, чем к обычному члену. Я знаю, что в изменчивом члене есть некоторая особенность выделения, например, его изменение будет немедленно видно для всех потоков, точка доступа к изменчивой переменной играет роль «барьера памяти». Но могут ли все эти побочные эффекты быть основной причиной 100-кратного замедления?

PS: я также провел тест на машине с процессором Core II. Это около 9:50, примерно в 5 раз медленнее. похоже, это также связано с архитектурой процессора.5 раз все еще много, верно?

7
задан soufrk 31 July 2019 в 06:17
поделиться