gpt4 book ai didi

java - JMH:在所有基准测试中使用相同的静态对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:41:36 25 4
gpt4 key购买 nike

我有一个构建一些复杂数据的类(想象一个大型 XML 或 JSON 结构 - 诸如此类)。 build 它需要时间。所以我想构造一次,然后在所有测试中使用相同的数据。目前,我基本上在定义 main 的类中定义了一个 public static 对象实例,然后在测试中显式引用它(代码是一个非常简化的示例):

public class Data 
{
// This class constructs some complicated data
}

public class TestSet
{
public static final Data PARSE_ME = new Data(...);

public static void main(String[] args) throws RunnerException
{
Options opt = new OptionsBuilder()
.include(".*ParserTest") // several tests
.forks(1)
.build();

new Runner(opt).run();
}
}

@State(Scope.Thread)
public class SomeParserTest
{
@Setup(Level.Iteration)
public void setup()
{
Parser parser = new Parser(TestSet.PARSE_ME);
}

@Benchmark
public void getId()
{
parser.getId(123);
}
}

这当然很糟糕......一个同样邪恶的选择是创建一个单独的类,以便它可以容纳一个静态对象。使用类似的东西会很好

Options opt = new OptionsBuilder()
...
.param(/*my Data object comes here*/)

param 只接受字符串,所以我不确定如何将对象(更重要的是:对象的同一实例!)传递给它。

那么,还有比我上面描述的全局对象更优雅的东西吗?

最佳答案

不幸的是,JMH 没有提供在基准之间共享数据的方法。

一方面,这打破了基准隔离,当一个基准可以静默修改另一个基准的输入数据时,导致比较不正确。这就是为什么您需要为每个基准测试@Setup @State 对象。

但更重要的是,无论您构建什么技巧来在基准测试之间共享数据(例如,可从两者访问的 static 字段)都会破坏默认的“ fork ”模式,此时 JMH 将执行每个测试自己的虚拟机。值得注意的是,您使用 static final Data TestSet.PARSE_ME 建议的内容实际上会针对每个 @Benchmark 执行,因为每个新的 VM 实例都必须初始化 TestSet 无论如何 ;) 当然,您可以禁用 fork ,但这带来的问题多于解决的问题。

因此,花时间使设置成本更容易接受可能是一个更好的主意,这样它就不会非常痛苦。例如,反序列化磁盘中的数据而不是计算它。或者,想出一种更快的计算方法。

关于java - JMH:在所有基准测试中使用相同的静态对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33790799/

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