Java 如果工作是由不同的线程执行的,那么如何使用JMH对吞吐量进行基准测试?

Java 如果工作是由不同的线程执行的,那么如何使用JMH对吞吐量进行基准测试?,java,benchmarking,performance-testing,microbenchmark,jmh,Java,Benchmarking,Performance Testing,Microbenchmark,Jmh,我们不确定如何对应用程序中多个线程(生产者)写入单个ConcurrentHashMap的部分进行基准测试。此外,如果达到某个大小,单个使用者线程会将映射切换为空映射。映射的切换是必要的,因为生产者线程需要在没有额外拥塞的情况下尽可能快地写入映射。使用者线程还处理映射的元素并将它们存储在缓冲区中。最后,另一个线程将缓冲区内容发送到应用程序的其他组件 我们不清楚如何度量元素写入ConcurrentHashMap直到准备好发送所需的时间(以及相应的吞吐量)(->聚合吞吐量)。现在,我们排除了发送元素来

我们不确定如何对应用程序中多个线程(生产者)写入单个ConcurrentHashMap的部分进行基准测试。此外,如果达到某个大小,单个使用者线程会将映射切换为空映射。映射的切换是必要的,因为生产者线程需要在没有额外拥塞的情况下尽可能快地写入映射。使用者线程还处理映射的元素并将它们存储在缓冲区中。最后,另一个线程将缓冲区内容发送到应用程序的其他组件

我们不清楚如何度量元素写入ConcurrentHashMap直到准备好发送所需的时间(以及相应的吞吐量)(->聚合吞吐量)。现在,我们排除了发送元素来简化事情。我们知道,吞吐量受到映射大小的限制。但是,我们希望对其进行测量,将其与未来实现的吞吐量进行比较

到目前为止,我们调查了以下情况:

筒仓测试
该基准将衡量单个基准中的每个步骤。基准测试A:在映射中插入元素,直到达到大小(=batchSize)。基准测试B:测量元素在缓冲区中存储的时间。
优势:相对容易实现。
缺点:通过将基准测试A和B一起添加,线程交互性会丢失,吞吐量聚合也不会给出

平坦测试
与思洛存储器测试相比,所有步骤都在一个基准(单线程)内执行。首先将X个元素插入映射,然后切换映射,处理X个元素并将其存储到缓冲区中。
优势:相对容易实现。
缺点:线程交互性丢失,基准测试只能由一个线程(->只有一个生产者)运行,因为当前实现不支持同时切换映射和处理元素

动态量测试(首选测试)
基准测试方法将在每次调用时向映射中插入一个元素。使用者线程将在@Setup阶段启动,并在测试期间将元素传递到缓冲区。在基准测试结束时,缓冲区中收集的元素计数将提供给JMH,以进行结果计算,而不是使用基准测试方法的调用。我们不知道这种开箱即用的功能允许我们在基准测试端向JMH提供缓冲区大小。我们很可能需要为此需求修改JMH(对吗?)。
优势:合成吞吐量由JMH计算
缺点:没有现成的功能,JMH修改可能是危险的(测量受到影响,基准有效性不明确)

附加说明:在这种情况下,我们还必须处理非稳态基准。我们考虑使用JMH的批处理可能性,并使用不同的大小进行测试


提前感谢您的建设性回复。

也许您会感兴趣?谢谢您指出这一点。我们用“控制”做了一些测试,但还没有解决我们的问题。