java - JMH vs JMeter 用于基准测试 Java 类?

标签 java jmeter load-testing microbenchmark jmh

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

最佳答案

我对 JMeter 和 JMH 都有丰富的经验。我会说在很多情况下你可以使用它们中的任何一个,但是在 Java 类基准测试的范围内,只有 JMH 是真正相关的,你不能用 JMeter 做类级基准测试,它只会是一个粗略的近似值。或者,如果您的类(class)正在进行一些长时间的操作,而精度并不那么重要,那么它可能会起作用。原因:

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

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

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

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

还有很多事情在 JMH 中非常容易,而在 JMeter 中他们需要很多不同的解决方法。例如:

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

在报告方面,JMH 与 JMeter 非常相似,它有 Jenkins 和 TeamCity 的插件,可以生成结果表和图表。它还可以以各种格式发布结果,这些结果可以被其他工具使用、处理或存储。

如果 JMH 如此出色,那么 JMeter 有什么用处?

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

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

  • 您可能还会觉得 JMeter 测试处于“功能”测试级别,而 JMH 测试处于“单元”测试级别。但这是相当主观的。

关于java - JMH vs JMeter 用于基准测试 Java 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50710148/

相关文章:

Java 日历,行为不同 OSX Windows

regex - Jmeter正则表达式可变行数

java - JMeter 清除 JDBC 响应数据

csv - JMeter:使用 CSV 数据将参数传递到 HTTP GET 请求查询字符串

load-testing - 逸 : Save final console output to file

java - 在事件发生时将自定义对象存储在 JLabel 中

java - 为什么 List<T>.toArray() 返回泛型 Object[] 而不是 T[]?

java - keep-alive 是否始终在使用 httpclient 的请求中发送以及如何防止发送它

linux - Siege 启动错误 - 无法连接到套接字

performance - 从 Jmeter 中的响应中捕获 header 值并重新使用