繁体   English   中英

如何使用JMH正确基准化“&”和“%”成本

[英]How to benchmark '&' vs '%' cost correctly, using JMH

因此,这是我要测试的简单内容,即mod操作或AND(假设为2的幂)运算速度更快-这是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;
    }
}

此博客文章中对此进行了详细介绍: 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的上下文中,该值用于从数组中读取,并且博客文章也介绍了该方面的含义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM