Vì vậy, đây là điều đơn giản tôi đang cố gắng để kiểm tra, điều gì là nhanh hơn một hoạt động mod hoặc một AND (giả sử sức mạnh của hai) - đây là những gì hashMap thực hiện nội bộ. Đây có phải là "kiểm tra" chính xác không? Tôi phải thừa nhận rằng nội bộ của jmh và nhận được để viết một tiêu chuẩn chính xác vi sau khi đi qua tất cả các mẫu (cho lần thứ 3 tôi nghĩ) là một thách thức khá. :)Làm thế nào để điểm chuẩn '&' vs '%' chi phí một cách chính xác, sử dụng 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;
}
}
Vâng, tất nhiên là không, 'arg% 33'! =' (Arg - 1) & 33'. Lấy '42' làm ví dụ ... –
Bạn muốn viết' arg% 32' và 'arg & (32 - 1)'? –
@AlekseyShipilev hoàn toàn xấu của tôi, đã sao chép mã sai. – Eugene