如果我想在我的Java类中对方法进行基准测试,哪一个是更好的选择?两者之间的利弊是什么?
答案 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 更多的相关模式,并且它们更容易设置:
在JMH中还有很多非常容易的东西,在JMeter中它们需要很多不同的解决方法。例如:
就报告而言,JMH与JMeter非常相似,它为Jenkins和TeamCity提供了插件,可以生成结果表和图表。它还可以以各种格式发布结果,这些格式可以由其他工具使用,处理或存储。
所以,如果JMH如此之大,那么 JMeter的优点是什么?
主要用于测试各种网络协议,而JMH不是针对该用例构建的。在这里您可能不关心JMeter的开销或JVM优化,并且可以利用JMeter中的内置采样器。当然,没有什么能阻止您使用JMH测试任何网络协议(只要您使用正确的库)。但是在JMeter中,您可以免于编写自定义代码来处理通信协议。
您不能/不想编写Java代码。在JMeter中,您可以直观地表达您的逻辑,这使得不编码的人可以编写测试(尽管您仍然可能需要使用一些编程概念来控制测试的逻辑,例如循环或定时器,并且您可能在前/后处理中需要一些脚本)。如果您可以使用它(例如,如果您记录HTTP测试),视觉记录也很有吸引力。
您可能还会觉得JMeter测试处于“功能”状态,而JMH测试处于“单元”测试级别。但那是非常主观的。
答案 1 :(得分:1)
如果它真的是你的 Java类,你需要的只是衡量每单位时间的操作数量 - 那就选择JMH,因为它是一个更轻量级的解决方案,可以直接集成到你的应用程序构建系统中(特别是如果你使用Maven)
JMeter是一个多协议负载测试工具,可用于评估某些功能性能,有两种机制可用:
JUnit Request采样器,它在JMeter类路径中检测库中的JUnit测试,因此您可以使用增加的线程数执行它们。
优点:
缺点: