2016-02-17 28 views
5

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; 
    } 
} 
+3

Vâng, tất nhiên là không, 'arg% 33'! =' (Arg - 1) & 33'. Lấy '42' làm ví dụ ... –

+0

Bạn muốn viết' arg% 32' và 'arg & (32 - 1)'? –

+0

@AlekseyShipilev hoàn toàn xấu của tôi, đã sao chép mã sai. – Eugene

Trả lời

4

này được trình bày chi tiết trong bài viết trên blog này: http://psy-lob-saw.blogspot.co.za/2014/11/the-mythical-modulo-mask.html

benchmark của bạn bị hỏng (so sánh những gì có vẻ như số lượng không liên quan) vì bạn đang so sánh (non_final_field & không đổi) với (% non_final_field liên tục). Replace with (non_final_field1% non_final_field2) và (non_final_field1 & (non_final_field2-1)), nơi non_final_field2 là một sức mạnh của 2.

Trong bối cảnh HashMap giá trị được sử dụng để đọc từ một mảng và các bài viết trên blog bao gồm những tác động của bên đó là tốt.

Các vấn đề liên quan