当前位置: 首页 > 面试题库 >

使用Java创建快速/可靠的基准测试?

麻宜春
2023-03-14
问题内容

我正在尝试使用Java创建基准测试。目前,我有以下简单方法:

public static long runTest(int times){
    long start = System.nanoTime();     
    String str = "str";
    for(int i=0; i<times; i++){
        str = "str"+i;
    }       
    return System.nanoTime()-start;     
}

我当前在另一个循环中多次发生此循环,该循环发生了多次,并获得了运行此方法所需的最小/最大/平均时间。然后,我在另一个线程上开始一些活动,然后再次进行测试。基本上,我只是想获得一致的结果…如果我有1000万次runTest循环,这似乎很一致:

Number of times ran: 5
The max time was: 1231419504 (102.85% of the average)
The min time was: 1177508466 (98.35% of the average)
The average time was: 1197291937
The difference between the max and min is: 4.58%

Activated thread activity.

Number of times ran: 5
The max time was: 3872724739 (100.82% of the average)
The min time was: 3804827995 (99.05% of the average)
The average time was: 3841216849
The difference between the max and min is: 1.78%

Running with thread activity took 320.83% as much time as running without.

但这似乎有点多,并且要花一些时间…如果我在runTest循环中尝试使用较小的数字(100000),则会开始变得非常不一致:

    Number of times ran: 5
    The max time was: 34726168 (143.01% of the average)
    The min time was: 20889055 (86.02% of the average)
    The average time was: 24283026
    The difference between the max and min is: 66.24%

    Activated thread activity.

    Number of times ran: 5
    The max time was: 143950627 (148.83% of the average)
    The min time was: 64780554 (66.98% of the average)
    The average time was: 96719589
    The difference between the max and min is: 122.21%

    Running with thread activity took 398.3% as much time as running without.

有什么方法可以使我的基准测试保持一致,高效/快速吗?

顺便说一下,我没有测试开始时间和结束时间之间的代码。我正在以某种方式测试CPU负载(请参阅如何启动一些线程活动并重新测试)。因此,我认为我正在寻找的东西可以替代“
runTest”中的代码,从而产生更快,更一致的结果。

谢谢


问题答案:

简而言之:

(微型)基准测试非常复杂,因此请使用基准测试框架http://www.ellipticgroup.com/misc/projectLibrary.zip之类的工具-
仍然对结果持怀疑态度(“将微型信任放入微型基准”,Cliff Click博士)。

详细地:

有很多因素会严重影响结果:

  • System.nanoTime的准确性和精确度:最坏的情况是与System.currentTimeMillis一样糟糕。
  • 代码预热和类加载
  • 混合模式:仅在足够频繁地调用代码块(1500或1000次)之后,JVM的JIT编译(请参见Edwin Buck的答案)
  • 动态优化:取消优化,堆栈替换,消除无效代码(您应该使用循环中计算出的结果,例如打印出来)
  • 资源回收:垃圾收集(请参阅Michael Borgwardt的答案)和对象完成
  • 缓存:I / O和CPU
  • 您的操作系统总体上:屏幕保护程序,电源管理,其他进程(索引器,病毒扫描等)

Brent
Boyer的文章“严格的Java基准测试,第1部分:问题”(http://www.ibm.com/developerworks/java/library/j-benchmark1/index.html)很好地描述了所有这些问题以及是否/原因您可以针对它们(例如,使用JVM选项或预先调用ProcessIdleTask)。

您将无法消除所有这些因素,因此进行统计是个好主意。但:

  • 而不是计算最大值和最小值之间的差,您应该努力计算标准偏差(结果{1,1000×2,3}与{501×1,501×3}不同)。
  • 通过产生置信区间(例如,通过引导)来考虑可靠性。

上面提到的Benchmark框架(http://www.ellipticgroup.com/misc/projectLibrary.zip)使用了这些技术。您可以在Brent
Boyer的文章“ Robust
Java基准测试,第2部分:统计和解决方案”(https://www.ibm.com/developerworks/java/library/j-benchmark2/)中阅读有关它们的信息。



 类似资料:
  • 本文向大家介绍Android 中构建快速可靠的 UI 测试,包括了Android 中构建快速可靠的 UI 测试的使用技巧和注意事项,需要的朋友参考一下 前言 让我一起来看看 Iván Carballo和他的团队是如何使用Espresso, Mockito 和Dagger 2 编写250个UI测试,并且只花了三分钟就运行成功的。 在这篇文章中,我们会探索如何使用Mockito(译者注:Mockito

  • 问题内容: 因为我不想自己做,所以我正在寻找Java的良好FFT实现。首先,我在这里使用了FFT Princeton的 这个,但是它使用了对象,而我的探查器告诉我,由于这个事实,它的速度并不是很快。所以我再次搜索了一下,发现了一个:更快的FFT Columbia 。也许你们中的一个知道另一种FFT实现?我想拥有“最好的”应用程序,因为我的应用程序必须处理大量的声音数据,并且用户不喜欢等待… ;-)

  • 知名框架项目,比如 Django 和 Rails 都有自己的一整套脚手架工具,负责快速生成项目基本代码。但对于小众一点的框架,则可能没有精力去开发类似的工具,又或者出于众口难调的原因,项目并没有官方认可的脚手架工具,这时候你又不希望把基础的代码重复一遍又一遍该怎么办呢?YeoMan 就提供了这样一个通用的项目初始化功能。 安装 YeoMan 是一个 node.js 项目,首先需要使用 npm 进行

  • 问题内容: 我想快速创建一个像这样的json: 如何创建此json? 问题答案: 创建您的对象,在这种情况下为字典: 从对象创建JSON数据: 如果需要,请使用JSON数据作为字符串:

  • 问题内容: 如果我使用内存数据库而不是PostgreSQL,则集成测试的运行速度会更快。我使用JPA(休眠),并且我需要一个内存数据库,该数据库很容易切换为使用JPA,易于设置且可靠。它需要相当广泛地支持JPA和Hibernate(或者反之亦然),因为我不想采用我的数据访问代码进行测试。 鉴于上述要求,哪个数据库是最佳选择? 问题答案: 对于 集成测试 ,我现在使用H2(来自HSQLDB的原始作者

  • 本文向大家介绍GNU/Linux 快速创建和使用GnuPG密钥,包括了GNU/Linux 快速创建和使用GnuPG密钥的使用技巧和注意事项,需要的朋友参考一下 示例 安装Haveged(示例sudo apt-get install haveged)可加快随机字节处理的速度。然后: 输出: 然后发布: 然后计划撤销:https://www.hackdiary.com/2004/01/18/revok