gpt4 book ai didi

java - 在一个基准内使用广泛的输入

转载 作者:行者123 更新时间:2023-12-01 09:23:57 26 4
gpt4 key购买 nike

我想为一些 map 实现(包括一个自定义实现)编写一个基准。我想测试它在广泛的输入范围内的平均表现。

由于这是我第一次使用 JMH,因此使用 @Param 看起来是显而易见的选择。但事实证明,JMH 不会在单个基准测试中使用所有这些不同的输入,而是会为每组参数运行单独的基准测试。

是否有一些我缺少的功能应该用于它,或者只是循环遍历我想要在基准测试中正确执行的输入范围?

更新:

我实现了 2 个不同的基准测试,它们给出了完全相反的比较结果(注意:这是使用 3d 坐标作为键的特殊 Map(不实现 Map 接口(interface)))。

  1. 循环基准测试中的输入范围

    @Benchmark
    public void benchmarkGet(Blackhole bh){
    //8*20 different starting positions
    for(int i = 0;i < 8 * 20;i++){

    for(int x = 0;x < 20;x++){
    for(int y = 0;y < 20;y++){
    for(int z = 0;z < 20;z++){
    Object value = map.get(x + offsets[i][0], y + offsets[i][1], z + offsets[i][2]));
    bh.consume(value);
    }
    }
    }
    }
    }
  2. 每次仅获取 1 个值,并使用状态每次获取不同的值:

    @Benchmark
    @OutputTimeUnit(value = TimeUnit.MICROSECONDS)
    public void benchmarkGet(Blackhole bh) {
    Object value = map.get(x + offsets[i][0], y + offsets[i][1], z + offsets[i][2]));
    bh.consume(value);
    x++;
    if (x > 20) {
    y++;
    x = 0;
    if (y > 20) {
    z++;
    y = 0;
    if (z > 20) {
    i++;
    z = 0;
    if (i >= 8*20) {
    i = 0;
    }
    }
    }
    }
    }

哪一个是正确的?

最佳答案

JMH 基准测试试图非常精确地测量特定代码段的性能。

只有当该问题包含哪些输入时才能回答哪种实现速度更快的问题,因为答案可能不同。要了解哪种实现平均速度更快,您需要知道必须平均的输入。

因此,一般来说,说任一实现速度更快都是不可能的,而且 JMH 也不会尝试回答这个问题。

您在向 JMH 询问您要问的问题时遇到了问题,“一般来说”哪一个更快,因为 JMH 认为这是错误的问题,并且很难向它提出错误的问题。

正确的实现实际上是使用具有不同值的Param,获得不同的基准,基准的结果就是您从中获得的答案的范围。

研究基准测试结果后的结果可能看起来像第一个算法对于某些范围内的小输入要快得多,但对于某些范围内的大输入要慢得多。您从中得出什么结论,哪个对于您的用例来说更快,必须根据用例得出。

关于java - 在一个基准内使用广泛的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39989589/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com