对CPU计算能力进行基准测试

时间:2016-08-18 11:21:55

标签: java android math benchmarking computation

我正在尝试使用一个简单的函数来对CPU计算能力进行基准测试,而不会在我的项目中添加包含数千行和一些MB的巨大框架。

我开发了这个示例代码。这是一个巨大的任务100倍。这个庞大的任务(benchmark()函数)包含一段时间,它将执行数学复合计算并在100ms的时间内增加计数器。每100ms用日志打印基准()函数完成复杂数学计算的次数。

好的,所以,我在屏幕上打印了100次计算。

我第一次执行基准测试时得到了正确的结果,基准测试的100次迭代中的每一次都或多或少地显示了相同的日志结果:

echo "<br><a href='".$row['pageLINK']."''>". $row['pageNAME']. "</a><br>";

但在一些处决之后,这个数字开始减少,我不明白为什么:

08-18 13:09:52.806 26543-27748/com.mytestapp D/XXXX: Iteration: 0 Result: 118200
08-18 13:09:52.906 26543-27748/com.mytestapp D/XXXX: Iteration: 1 Result: 171580
08-18 13:09:53.006 26543-27748/com.mytestapp D/XXXX: Iteration: 2 Result: 170654
08-18 13:09:53.106 26543-27748/com.mytestapp D/XXXX: Iteration: 3 Result: 168676
08-18 13:09:53.206 26543-27748/com.mytestapp D/XXXX: Iteration: 4 Result: 168372
08-18 13:09:53.306 26543-27748/com.mytestapp D/XXXX: Iteration: 5 Result: 165558
08-18 13:09:53.406 26543-27748/com.mytestapp D/XXXX: Iteration: 6 Result: 171368
08-18 13:09:53.506 26543-27748/com.mytestapp D/XXXX: Iteration: 7 Result: 171680
08-18 13:09:53.606 26543-27748/com.mytestapp D/XXXX: Iteration: 8 Result: 171516
08-18 13:09:53.706 26543-27748/com.mytestapp D/XXXX: Iteration: 9 Result: 171598

如果我等待几分钟再试一次,结果会再次增加到正常值。

为什么会这样?如何避免它并始终获得正确的基准测试结果?

这是我的示例代码:

08-18 13:10:20.850 26543-28161/com.mytestapp D/XXXX: Iteration: 1 Result: 94320
08-18 13:10:20.951 26543-28161/com.mytestapp D/XXXX: Iteration: 2 Result: 90364
08-18 13:10:21.051 26543-28161/com.mytestapp D/XXXX: Iteration: 3 Result: 94240
08-18 13:10:21.152 26543-28161/com.mytestapp D/XXXX: Iteration: 4 Result: 93676
08-18 13:10:21.252 26543-28161/com.mytestapp D/XXXX: Iteration: 5 Result: 91554
08-18 13:10:21.352 26543-28161/com.mytestapp D/XXXX: Iteration: 6 Result: 94358
08-18 13:10:21.452 26543-28161/com.mytestapp D/XXXX: Iteration: 7 Result: 90954
08-18 13:10:21.552 26543-28161/com.mytestapp D/XXXX: Iteration: 8 Result: 94874
08-18 13:10:21.652 26543-28161/com.mytestapp D/XXXX: Iteration: 9 Result: 94464

...

public void benchmarkIterator(){
    int result = 0;
    int iterations = 100;
    for (int i=0; i<iterations; i++){
       result = benchmark();
       Log.d("XXXX", "Iteration: "+i+" Result: "+result);
    }
}

2 个答案:

答案 0 :(得分:1)

过热?不,我怀疑这个计算会让你的CPU崩溃。

我认为随时间的变化与JVM和统计数据有关。 HotSpot编译器使用它们根据代码的运行情况优化代码分支。

http://blog.takipi.com/jvm-performance-magic-tricks/

https://wiki.openjdk.java.net/display/HotSpot/PerformanceTechniques

您可以知道发生了什么的唯一方法是使用分析器。您需要查看垃圾收集,内存以及花费时间的位置。您的简单基准测试无法为您提供这种洞察力。

答案 1 :(得分:0)

如果我理解正确,那么两个日志片段是针对不同的JVM启动进行的不同执行吗?

在这种情况下,两者之间的差异不能由JVM引起(因为它已经重新启动)。

所以,差异可能是由很多东西造成的:操作系统文件缓存(已经有一些文件正在进行),CPU电源管理(CPU频率在不使用时下降可能需要一些时间才能返回它的最大频率),在主机上运行的其他东西(如果它是一个VM ...很多东西可以继续),CPU优化(如预取的分支预测),......

无论如何,你没有问题,这就是计算机/ jvm / cpu最近的工作方式...