2016-02-17 2 views
5

Итак, вот простая вещь, которую я пытаюсь проверить, что быстрее операция mod или И один (при условии, что она равна двум) - это то, что hashMap делает внутренне. Это правильно написанный «тест»? Я должен признать, что внутренности jmh и получение правильного микро-теста после прохождения всех образцов (в течение 3-го времени, я думаю) - довольно сложная задача. :)Как оценивать «&» vs «%» правильно, используя JMH

@State(Scope.Thread) 
@BenchmarkMode(org.openjdk.jmh.annotations.Mode.AverageTime) 
@OutputTimeUnit(TimeUnit.NANOSECONDS) 
public class MeasureSpeedModuleVsAnd { 

    public static void main(String[] args) throws Exception { 
     Options opt = new OptionsBuilder() 
       .include(MeasureSpeedModuleVsAnd.class.getSimpleName()) 
       .forks(1) 
       .warmupIterations(1) 
       .measurementIterations(5) 
       .warmupTime(TimeValue.seconds(2)) 
       .build(); 

     new Runner(opt).run(); 

    } 

    @Param({ "16", "32", "256", "1048576" /* 2 power of 10 */ }) 
    public int number_of_buckets; 

    @Param({ "345984", "123456", "111", "98653" }) 
    public int hashcode; 

    @Benchmark 
    public int benchamark_modulo() { 
     return hashcode % number_of_buckets; 
    } 

    @Benchmark 
    public int benchmark_and() { 
     return (number_of_buckets - 1) & hashcode; 
    } 
} 
+3

Ну, конечно, нет, 'arg% 33'! =' (Arg - 1) & 33'. Возьмите '42' в качестве примера ... –

+0

Вы хотели написать' arg% 32' и 'arg & (32 - 1)'? –

+0

@AlekseyShipilev полностью мой плохой, скопировал неправильный код. – Eugene

ответ

4

Это подробно рассматривается в этом блоге: http://psy-lob-saw.blogspot.co.za/2014/11/the-mythical-modulo-mask.html

Вашего тест сломан (сравнивая то, что кажется, не относящиеся к делу количеств), потому что вы сравниваете (non_final_field & константы) с (постоянным% non_final_field). Заменить (non_final_field1% non_final_field2) и (non_final_field1 & (non_final_field2-1)), где non_final_field2 является степенью 2.

В контексте HashMap значение используется для чтения из массива и записи блога охватывает последствия с этой стороны.