停止 JMH 中的 JVM 对象缓存

问题描述 投票:0回答:1

我需要在 JMH 基准测试中执行预热迭代时停止 JVM 对象缓存。

请解释一下如何停止它而不建议从 JMH 基准测试中删除预热迭代?有任何注释可以做到这一点吗?

java caching benchmarking jmh
1个回答
0
投票

我需要在 JMH 基准测试中执行预热迭代时停止 JVM 对象缓存。

不存在一般意义上的“JVM 对象缓存”。 JVM 不缓存对象。对象缓存是一个应用程序关注的问题。

您在评论中澄清了这一点:

当我使用定时基准测试对我的 Jackson 对象转换代码进行基准测试时,性能更差,但是当我使用 JMH 对它进行基准测试时,它是 json 构建器、Gson 和 Jackson 中最好的。我认为发生这种情况只是因为在 JMH 中使用了 ObjectMapper 对象,这样它会更快地执行代码。

啊。好的。

您指的是(明显的)缓存

ObjectMapper
。 (例如,请参阅 Jackson javadocs 中的
ObjectMapper

如上所述,这是应用程序缓存而不是 JVM 对象缓存。 JVM对此一无所知。

实现此目的的方法是禁用或使映射器的缓存无效。在杰克逊的案例中,似乎没有一种快速简便的方法可以做到这一点。但是,您似乎可以为不缓存任何内容的序列化器和反序列化器创建一个带有自定义提供程序的 Jackson

ObjectMapper
。这看起来可行,但我不会尝试向您展示如何做到这一点。

但是...

我认为这是错误的做法。

  1. 对象缓存是各种 JSON 实现性能的重要组成部分。您不会在生产应用程序中禁用缓存。因此,如果您在禁用缓存的情况下运行 JMH 基准测试,您将获得的基准测试数字并不表明相应 JSON 实现在实际应用程序中的实际执行情况。

  2. 如果您的目标是使某些非 JMH 基准测试的结果与现有 JMH 基准测试一致,那就是错误的。您真正应该做的是将非 JMH 基准重新编码为 JMH 基准。那么你可以确定:

    • 您在基准测试中都没有预热和其他问题,并且
    • 您(可以)知道这两个基准测试使用相同的方法。

    在没有看到任何一个(假设的)基准测试的代码的情况下,我要做的就是重构基于 JMH 的基准测试,以便序列化和反序列化相同的对象,但使用不同的 JSON 堆栈来执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.