Вы не предоставили достаточно информации, чтобы дать какие-либо однозначные ответы, но оптимизатор времени выполнения jvm чрезвычайно мощен и выполняет всевозможные встраивания, анализ данных во время выполнения и анализ escape, а также всевозможные приемы кеширования.* Конечный результат состоит в том, чтобы сделать такие микропроцессоры, которые вы пытаетесь выполнить, практически бесполезными на практике;и крайне трудно понять, что правильно, даже если они потенциально полезны.
Определенно прочитайте http://www.ibm.com/developerworks/java/library/j-benchmark1.html для более полного обсуждения проблем, с которыми вы сталкиваетесь.По крайней мере, вам нужно убедиться:
- foo вызывается в цикле, который выполняется тысячи раз
- foo () возвращает результат, а
- , чтоиспользуется результат
Ниже приводится минимальная начальная точка, предполагая, что foo () нетривиальна и, следовательно, вряд ли будет встроенной.Примечание. Вам все еще следует ожидать развертывания цикла и других оптимизаций уровня кэша.Также обратите внимание на точку останова компиляции горячей точки (я полагаю, что это ~ 5000 вызовов на сервере IIRC), которая может полностью заполнить ваши измерения, если вы попытаетесь повторно запустить измерения в той же JVM.
public class FooBar {
public static void main(String[] args) {
int sum = 0;
int ITERATIONS = 10000;
for (int i = 0; i < ITERATIONS; i++) {
sum += foo(i);
}
System.out.println("%d iterations returned %d sum", ITERATIONS, sum);
}
}
Серьезно, вам нужно немного почитать, прежде чем вы сможете добиться значительного прогресса в написании тестов для современной JVM.Те же оптимизации, которые позволяют современному Java-коду соответствовать или даже иногда превосходить C ++, затрудняют сравнительный анализ.