Здесь я написал тест на скорость доступа локального, членского, изменчивого члена:
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 раз все еще много, верно?