Держу пари на 5 золотых, что никто не проверял это на практике Я из чистого любопытства написал, простенький тест, и чтобы он был более объективен, хотел бы попросить всех желающих прогнать его у себя на машине. Код теста:
Код | package test;
import java.util.Random;
public class Test {
final static int LEN = 100000000;
final static int SET = 100;
private static long totalTimeDefinedIf = 0; private static long totalTimeRandomIf = 0; private static long totalTimeDefinedSwitch = 0; private static long totalTimeRandomSwitch = 0;
public static void main(String[] args) { Random r = new Random(System.currentTimeMillis()); int[] randomArr = new int[LEN]; for (int i = 0; i < randomArr.length; i++) { randomArr[i] = r.nextInt(10); }
for (int i = 0; i < SET; ++i) { System.err.println(String.format("Percent done: %.0f%%", (double)i/SET * 100)); iterateIfs(randomArr, r); iterateSwitches(randomArr, r); } System.err.println("DefinedIf,RandomIf,DefinedSw,RandomSw"); System.err.println(String.format("%.2f,%.2f,%.2f,%.2f", (double) totalTimeDefinedIf / SET, (double) totalTimeRandomIf / SET, (double) totalTimeDefinedSwitch / SET, (double) totalTimeRandomSwitch / SET) ); }
private static void iterateIfs(final int[] randomArr, final Random r) { final long start = System.currentTimeMillis(); for (int i = 0; i < randomArr.length; i++) { int temp = -1; if (0 == randomArr[i]) { temp = 0; } else if (1 == randomArr[i]) { temp = 1; } else if (2 == randomArr[i]) { temp = 2; } else if (3 == randomArr[i]) { temp = 3; } else if (4 == randomArr[i]) { temp = 4; } else if (5 == randomArr[i]) { temp = 5; } else if (6 == randomArr[i]) { temp = 6; } else if (7 == randomArr[i]) { temp = 7; } else if (8 == randomArr[i]) { temp = 8; } else if (9 == randomArr[i]) { temp = 9; } else { temp = randomArr[i]; System.err.println("Err: " + temp); } }
final long switchStart = System.currentTimeMillis() - start; totalTimeDefinedIf += switchStart;
final long randomStart = System.currentTimeMillis(); for (int i = 0; i < randomArr.length; i++) { final int rnd = r.nextInt(10); int temp = -1; if (0 == rnd) { temp = 0; } else if (1 == rnd) { temp = 1; } else if (2 == rnd) { temp = 2; } else if (3 == rnd) { temp = 3; } else if (4 == rnd) { temp = 4; } else if (5 == rnd) { temp = 5; } else if (6 == rnd) { temp = 6; } else if (7 == rnd) { temp = 7; } else if (8 == rnd) { temp = 8; } else if (9 == rnd) { temp = 9; } else { temp = rnd; System.err.println("Err: " + temp); } } final long endRndIfStart = System.currentTimeMillis() - randomStart;
totalTimeRandomIf += endRndIfStart;
}
private static void iterateSwitches(final int[] randomArr, final Random r) {
final long switchStart = System.currentTimeMillis(); for (int i = 0; i < randomArr.length; i++) { int temp = -1; switch (randomArr[i]) { case 0: temp = 0; break; case 1: temp = 1; break; case 2: temp = 2; break; case 3: temp = 3; break; case 4: temp = 4; break; case 5: temp = 5; break; case 6: temp = 6; break; case 7: temp = 7; break; case 8: temp = 8; break; case 9: temp = 9; break; default: temp = randomArr[i]; System.err.println("Err: " + temp); } }
final long endSwitchStart = System.currentTimeMillis() - switchStart; totalTimeDefinedSwitch += endSwitchStart;
final long rndSwitchStart = System.currentTimeMillis(); for (int i = 0; i < randomArr.length; i++) { final int rnd = r.nextInt(10); int temp = -1; switch (rnd) { case 0: temp = 0; break; case 1: temp = 1; break; case 2: temp = 2; break; case 3: temp = 3; break; case 4: temp = 4; break; case 5: temp = 5; break; case 6: temp = 6; break; case 7: temp = 7; break; case 8: temp = 8; break; case 9: temp = 9; break; default: temp = rnd; System.err.println("Err: " + temp); } }
final long endRndSwitchStart = System.currentTimeMillis() - rndSwitchStart; totalTimeRandomSwitch += endRndSwitchStart; } }
|
Тест идет около 15 минут, поэтому просьба проявить терпение. В результатах присутствует 4 метрики- DefinedIf -- Среднее время работы условий на массиве
- RandomIf -- Среднее время работы условий на случайных данных
- DefinedSw -- Среднее время работы switch на массиве
- RandomSw -- Среднее время работы switch на случайных данных
Случайные данные используются для того, чтобы немного спутать Advanced Branch Prediction
В ответах просьба указать выхлоп, ось и ваш CPU
Мои результаты Java: Java SE Runtime Environment (build 1.6.0_14-b08) Java HotSpot Server VM (build 14.0-b16, mixed mode) OS: Ubuntu 9.04 CPU: Core2 Duo CPU P8600 @ 2.40GHz
Цитата | DefinedIf,RandomIf,DefinedSw,RandomSw 1253.61,3060.33,1198.82,3190.20
|
|