2014-01-02 2 views
1

У меня есть два метода, которые я хотел бы профиль в NetBeansМетоды принимают в Netbeans 0 мс профилировщика

Здесь есть код

public static boolean compare1(int a,int b){ 

     if((a-b)>10) 
      return true; 
     else 
      return false; 

    } 
    public static boolean compare2(int a,int b){ 

     a = ((a&0xf00000)>>12)+((a&0xf000)>>8)+((a&0xf0)>>4); 
     b = ((b&0xf00000)>>12)+((b&0xf000)>>8)+((b&0xf0)>>4); 
     if(a==b) 
      return true; 
     else 
      return false; 


    } 

Как всегда Netbeans возвращает 0 мс для обоих методов !! Я запустил профилировщик netbeans для всего проекта, и snap shot говорит, что время автономной работы каждого из этих методов составляет 0 мс.

Я вызываю эти два метода из основного, используя цикл 1000 раз. Если время выполнения настолько значительно меньше, что они не могут быть выражены в MS, есть ли способ выразить это в наносекундах? Я буду использовать эти методы миллион раз за кадр изображения, который составляет 30 миллионов раз в секунду. Мне нужно профилировать и выбирать лучший метод очень плохо.

+0

Действительно ли разница в миллисекундах действительно важна? (ответ: нет) – Doorknob

+0

(Боковое замечание: ваш первый метод может быть записан в одной строке 'return (a - b)> 10', и вы можете заменить' if' во втором методе 'return a == b '. –

+0

У вас есть часы с секундной стрелкой? Не запускайте их 10^3 раза. Запустите их 10^9 раз и посмотрите, сколько секунд они берут. Это говорит вам, сколько наносекунд вызывается одним вызовом (1 мс = 10^6 нс, что, вероятно, потому, что вы видите 0ms.) Кстати, это не похоже, что эти две функции делают то же самое. –

ответ

0

В основном я вижу быстрые манипуляции с битами в вашем примере кода, поэтому 0 мс не удивительно. Вы можете попробовать System.nanoTime() для измерения относительной продолжительности для довольно длинного цикла циклов.

Но: Почему вас волнует оптимизация/производительность такого быстрого кода ???

+0

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

1

Здесь для вашего удобства:

@OutputTimeUnit(TimeUnit.MICROSECONDS) 
@BenchmarkMode(Mode.Throughput) 
@Warmup(iterations = 3, time = 1) 
@Measurement(iterations = 3, time = 1) 
@State(Scope.Thread) 
@Fork(3) 
public class Comparison 
{ 
    int a, b; 
    final Random rnd = new Random(); 

    @Setup(Level.Iteration) 
    public void setup() { a = rnd.nextInt(); b = rnd.nextInt(); } 

    @GenerateMicroBenchmark 
    public boolean testCompare1() { return compare1(a, b); } 

    @GenerateMicroBenchmark 
    public boolean testCompare2() { return compare2(a, b); } 

    static boolean compare1(int a, int b) { return a - b > 10; } 
    static boolean compare2(int a, int b){ 
    return ((a&0xf00000)>>12)+((a&0xf000)>>8)+((a&0xf0)>>4) == 
      ((b&0xf00000)>>12)+((b&0xf000)>>8)+((b&0xf0)>>4); 
    } 
} 

Результат:

Benchmark  Mode Thr Cnt Sec   Mean Mean error Units 
testCompare1 thrpt 1  9 1  529.178  5.925 ops/usec 
testCompare2 thrpt 1  9 1  288.288  4.058 ops/usec 

Это означает, что, по крайней мере, на моем компьютере, вы могли бы достичь 288 миллионов звонков в секунду для медленного метода (compare2).

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