当前位置: 首页 > 知识库问答 >
问题:

如何基准化

那存
2023-03-14

下面是我试图测试的一件简单的事情,mod操作或a AND one(假设幂为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;
    }
}

共有1个答案

尉迟明贤
2023-03-14

这篇博文详细介绍了这一点:http://psy-lob-saw.blogspot.co.za/2014/11/the-mythical-modulo-mask.html

你的基准被打破了(比较看似无关的数量),因为你在比较(非最终字段)

在HashMap的上下文中,该值用于从数组中读取,博客文章也讨论了这方面的含义。

 类似资料:
  • 我定期关注GitHub Rakudo存储库,查看Rakudo编译器发生了哪些变化。 我有时会看到提交,其中单个函数的速度提高了一定的百分比,时间如下图所示。 评估这一点的工作流是什么?我很想了解这一点,以便了解您的功能是如何执行的,并相应地进一步优化,从而为Rakudo的发展做出贡献。 我在这里阅读帮助。我谷歌了一下,但找不到此信息。我还通过命令行选项了解了MoarVM分析器,它会生成输出。要寻找

  • 问题内容: 您如何用Java编写(并运行)正确的微基准测试? 我正在寻找一些代码示例和注释,以说明要考虑的各种问题。 示例:基准测试应该测量时间/迭代或迭代/时间,为什么? 问题答案: 有关从Java HotSpot的创建者编写微基准测试的提示: 规则0:阅读有关JVM和微基准测试的著名论文。好的人是布莱恩·格茨(Brian Goetz),2005年。不要对微观基准期望太高;它们仅测量有限范围的J

  • 问题内容: 我想知道什么是基准测试我的PHP脚本的最佳方法。cron作业,网页或Web服务无关紧要。 我知道我可以使用microtime,但这真的给了我PHP脚本的实时性吗? 我想测试和测试PHP中执行相同功能的不同函数。例如,vs 或vs 或preg_replace vs str_replace` 网页示例: 这将输出:0.0146126717(一直在变化-但这是我得到的最后一个)。这意味着执行

  • 请阅读此问题的最新编辑。 问题:我需要编写一个正确的基准测试,以将使用不同线程池实现(也来自外部库)使用不同的执行方法的不同工作与使用其他线程池实现的其他工作以及没有任何线程的工作进行比较。 例如,我有24个任务要完成,10000个随机字符串处于基准状态: 和两个状态作为表示工作的内部类(string concat。)和ExecutorService的设置和关闭: 更严格的问题是:如何编写正确的基

  • 由于这里没有人问它,我将回答我自己的问题,以便将来所有的参考。这不是一个抽象的(学习)练习,而是一个真实的基准测试,它为我在大型SaaS系统中的数据网格使用建模--主要用于显示排序和过滤的分页列表。我主要想知道与原始的无框架Hazelcast和Ignite使用相比,我的通用JDBC数据网格访问层增加了多少开销。但既然我在比较苹果,基准来了。

  • 本章介绍本书所需要的一些准备工作. 请确保把各部分的准备工作完成 知识点 设置的Eclipse的编码 下载,安装,配置mysql数据库 配置Eclipse中Server环境