如何在Java中对主机多线程CPU性能进行基准测试?

问题描述 投票:2回答:3

我需要创建一个简单的Java应用程序,它只返回一个数字:估计的CPU性能。例如,当我在具有4个内核的机器上运行它时,我将大致比使用2个内核运行时大两倍。这个应用程序应该使用100%的CPU几秒钟来测量它。我真的不担心准确性。

我真的很惊讶我找不到任何已经这样做的Java库。当然还有其他语言的工具,但在我的环境中只有Java被批准。

我目前的想法是在我的代码中使用来自SciMark 2.0的类并从多个线程运行它,但是这个工具看起来非常混乱(例如以小写字母开头的类名)并且我需要编写自定义代码来运行这些线程并组合结果。

我可以做得更好来解决这个问题吗?

java benchmarking
3个回答
1
投票

如果我理解正确,您的目标是衡量系统性能而不是应用程序性能。

这是问题所在。系统性能不能简化为单个有意义的数字。实际上,系统性能......甚至CPU性能都是多维的。

例如,内存密集型应用程序将在不同的计算机上执行不同的应用程序,具体取决于CPU芯片的内存高速缓存大小和设计......以及内存速度。但如果应用程序是计算密集型的,那么性能将更多地取决于时钟速率和核心数。

然后,当核心数量很高和/或你有多个CPU芯片时,会出现NUMA单元和线程固定的影响等问题。

这些和类似的问题是为什么尝试独立于应用程序测量原始CPU性能的基准测试已经大大失宠。 (MIPS最初意味着每秒百万(硬件)指令。它现在通常被称为每秒神话指令......暗示该措施的粗略性作为实际应用程序性能的预测器)


0
投票

Java Mcrobenchmark Harness (JMH)是实现Java代码基准测试的工具包。

它衡量吞吐量或平均时间;你可以用它来估算cpu周期。

基本上,您需要使用@Benchmark注释您想要进行基准测试的方法。这种方法

他们的存储库中很少有qazxsw poi。

在运行基准测试时,让计算机独自运行总是需要JMH usage samples,你应该关闭所有其他应用程序(如果可能的话)。如果您的计算机正在运行其他应用程序,则这些应用程序可能需要花费一些时间从CPU获得不正确(较低)的性能数

如果你想进一步挖掘CPU性能(周期,缓存使用,指令等),你可能需要使用recommended


0
投票

这是最简单的代码,可以满足我的需求。它尝试通过计算后续整数的平方根总和来估计多个线程的CPU性能。可以调整变量Linux perf以增加/减少基准长度。在我的机器上使用默认值大约需要7秒。

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