2015-05-05 5 views
-1

Я пытаюсь сравнить два разных метода для одной и той же проблемы в этой основной функции. Однако первый критерий для метода второй отличается от других результатов.Бенчмаркинг двух методов приводит к неточному результату

Также возникает проблема, когда истекшее время, для метода второго метода, равного 0.0 нс, что странно для меня.

Что мне не хватает?

Выход

Iterative Method - Elapsed time (µs) 
       27.151 
       26.895 
       21.773 
       28.432 
       26.127 
================================================== 
Formula method  - Elapsed time (µs) 
       5.123 
       1.281 
       0.512 
       0.513 
       0.512 

Главный код:

public static void main(String[] args) 
{ 
    int testSize = 5; 

    System.out.println("Iterative Method\t-\tElapsed time (µs)"); 
    for (int i = 0; i < testSize; i++) 
    { 
     long startTime = System.nanoTime(); 
     iterativeMethod(); 
     long estimatedTime = System.nanoTime() - startTime; 

     System.out.println("\t\t\t\t" + estimatedTime/1000f); 
    } 
    System.out.println("=================================================="); 
    System.out.println("Formula method\t\t-\tElapsed time (µs)"); 
    for (int i = 0; i < testSize; i++) 
    { 
     long startTime = System.nanoTime(); 
     int foo = SumDivisibleBy(3) + SumDivisibleBy(5) - SumDivisibleBy(15); 
     long estimatedTime = System.nanoTime() - startTime; 

     System.out.println("\t\t\t\t" + estimatedTime/1000f); 
    } 
} 
+0

Для измерения времени используйте 'System.currentTimeMillis()'. Причина в том, что для компьютера требуется слишком много времени (в наносекундах), чтобы получить от него надежную ценность. – Emz

+3

Не пишите свой собственный бенчмаркинг. Вместо этого используйте что-то вроде JMH (http://stackoverflow.com/questions/tagged/jmh). – Misha

ответ

3

Компилятор Java и JVM могут связываться с вашим кодом во многих отношениях, что очень трудно получить микро-бенчмарк справа. Например, петли могут быть удалены, экземпляры могут вообще не выделяться, операторы могут быть переупорядочены и заблокированы, и т.д.

Так что я боюсь, что простой эталон, как этот, абсолютно не имеет значения, и вы должны не воспринимайте его результаты слишком серьезно.

Если вы не знаете, как распечатать сгенерированную сборку и посмотреть, что на самом деле происходит во время выполнения кода, я предлагаю вам переписать эталон, используя JMH.

JMH - это эталонный стандарт, официально представленный Oracle, и специально разработанный для того, чтобы заботиться о странностях JVM и обеспечивать правильное измерение правильных вещей.

Это довольно простой в использовании, и все основные IDE имеют какую-то поддержку для него. Вы можете найти учебники и ресурсы JMH here.

Смежные вопросы