Итак, вот простая вещь, которую я пытаюсь проверить, что быстрее операция мода или операция И (при условии степени двойки) - это то, что hashMap делает внутри. Это правильно пишется "испытание"? Я должен признать, что внутренности 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;
}
}
arg % 33
!=(arg - 1) & 33
. Возьмите42
в качестве примера... - person Aleksey Shipilev   schedule 17.02.2016arg % 32
иarg & (32 - 1)
? - person Tagir Valeev   schedule 18.02.201632453667 % arg
это настоящая хэш-функция?(arg - 1) & 32453667
что должен делать?32453667
не является ни простым числом, ни степенью двойки, ни степенью двойки минус один. Какая. . Ад. Я в замешательстве. - person Aleksey Shipilev   schedule 19.02.2016&
только добавляет путаницы.hash % modulo
=hash & (modulo - 1)
, если по модулю действительно степень двойки. - person Aleksey Shipilev   schedule 21.02.2016