JMH与JMeter对Java类进行基准测试?

时间:2018-06-05 23:13:19

标签: java jmeter load-testing microbenchmark jmh

如果我想在我的Java类中对方法进行基准测试,哪一个是更好的选择?两者之间的利弊是什么?

2 个答案:

答案 0 :(得分:4)

我对JMeter和JMH都有很多经验。我想说在很多情况下你可以使用其中任何一种,但在 Java类基准测试的范围内,只有JMH才真正相关,你不能用JMeter进行类级别的基准测试,它只是粗略的近似。或者,如果您的班级正在进行一些长期操作,那么它可能会起作用,其中精度并不重要。原因:

  • JMeter自己的开销很大。例如,我有一个测试函数X的JMH测试,平均值约为0.01ms。我还在JMeter中使用此函数在自定义Java采样器中进行设置。该采样器通常显示平均约20ms。这是200倍的差异,就像JMeter的开销一样。

  • 使用JMeter,您无法避免makes benchmark effectively unrealistic的JVM优化(尽管由于问题#1可能无关紧要)。 JMH有一个防止这种陷阱的机制。我不认为在JMeter中你可以用任何干净的方式解决这个问题。

我也不同意Dmitri T的观点,即它具有“有限的模式数量” - 它实际上具有比JMeter 更多的相关模式,并且它们更容易设置:

  • 首先它有several modes you can choose from(包括“保持负载的时间”)。它还能够同时使用所有模式(具有单独的结果),因此您不必选择单一模式,只需通过注释或命令行参数指定。在JMeter中,只有通过额外的开发才能实现(例如,单独的线程组或测试)。
  • JMH没有加速,但它有预热,允许从结果中排除初始执行,从而确保结果从初始启动噪声中清除,这与渐进的目标基本相同
  • 肯定有控制迭代的方法:数量,时间等等;通过注释或命令行。

在JMH中还有很多非常容易的东西,在JMeter中它们需要很多不同的解决方法。例如:

  • 同步迭代是JMH中的注释问题,但需要在JMeter中进行仔细设置。
  • asymetric test,它允许您同时测试生产者/消费者模型,但可以独立测量它们。在JMH中,你编写测试,用注释标记它们,你就完成了。在JMeter中,你需要很大的开销才能正确设置

就报告而言,JMH与JMeter非常相似,它为Jenkins和TeamCity提供了插件,可以生成结果表和图表。它还可以以各种格式发布结果,这些格式可以由其他工具使用,处理或存储。

所以,如果JMH如此之大,那么 JMeter的优点是什么?

  • 主要用于测试各种网络协议,而JMH不是针对该用例构建的。在这里您可能不关心JMeter的开销或JVM优化,并且可以利用JMeter中的内置采样器。当然,没有什么能阻止您使用JMH测试任何网络协议(只要您使用正确的库)。但是在JMeter中,您可以免于编写自定义代码来处理通信协议。

  • 您不能/不想编写Java代码。在JMeter中,您可以直观地表达您的逻辑,这使得不编码的人可以编写测试(尽管您仍然可能需要使用一些编程概念来控制测试的逻辑,例如循环或定时器,并且您可能在前/后处理中需要一些脚本)。如果您可以使用它(例如,如果您记录HTTP测试),视觉记录也很有吸引力。

  • 您可能还会觉得JMeter测试处于“功能”状态,而JMH测试处于“单元”测试级别。但那是非常主观的。

答案 1 :(得分:1)

如果它真的是你的 Java类,你需要的只是衡量每单位时间的操作数量 - 那就选择JMH,因为它是一个更轻量级的解决方案,可以直接集成到你的应用程序构建系统中(特别是如果你使用Maven

  • 优点:
    • 简单(假设您是Java开发人员)
    • 占地面积小
  • 缺点:
    • 支持有限数量的模式(工作负载模型)
    • 非常有限的报告选项,对非技术人员说的不多
    • 没有多少集成选项

JMeter是一个多协议负载测试工具,可用于评估某些功能性能,有两种机制可用:

  • JSR223 SamplerGroovy语言 - 您可以在其中编写任意代码
  • JUnit Request采样器,它在JMeter类路径中检测库中的JUnit测试,因此您可以使用增加的线程数执行它们。

  • 优点:

    • 在工作负载模型定义方面非常强大,您可以配置线程加速,减速,迭代,保持负载的时间等。
    • 可以从命令行,IDE,Ant任务,Maven插件等运行。
    • 测试报告可以导出为CSV,HTML,图表,HTML Reporting Dashboard
  • 缺点:

    • 如果您没有以前的JMeter经验,则需要学习其他工具
    • 相对较大的占用空间(至少+ ~100 MB的JVM堆)和报告子系统会对您的测试结果产生负面影响,即假设您使用90%的可用操作系统资源,您将在同一硬件上使用JMH获得更高的吞吐量。 / LI>