У меня есть класс, который делает некоторые трудоемкие вычисления. Я пытаюсь тест производительности этого:Как я могу быть уверен, что компилятор не оптимизирует мой тест производительности?
int numValues = 1000000;
Random random = new Random();
startMeasuringTime();
double result;
for (int i = 0; i < numValues; i++) {
result = calculatorInstance.doSomeTimeConsumingCalculationsOn(random.nextDouble());
}
stopMeasuringTime();
Я использую случайные значения, так что компилятор не позволит оптимизировать расчеты для того, чтобы быть в миллион раз то же самое. Но как насчет результатов? Компилятор видит, что он больше не используется и не выполняет вызов (но может ли он увидеть любые побочные эффекты, которые может вызвать метод?)
Я не хочу помещать результаты где-нибудь (в файл, массив или System.out), потому что я думаю, что это замедлит тест с работой, которую я не хочу измерять. Или создайте OutOfMemoryError.
Заранее спасибо.
EDIT: изменил название немного
Возможный дубликат [Как написать правильный микро-тест в Java?] (Http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in -java) –
Что касается вашего теста, я не знаю, как потреблять «doSomeTimeConsumingCalculationsOn», но если он не так длинный *, вы, вероятно, сравниваете как ваш метод, так и 'random.nextDouble()'. – gabuzo