我的JUnit套件中有一个测试,它警告我性能下降。测试按照以下方式进行:通常,我每秒可以运行100'000次操作,但构建服务器上的负载可能会有所不同,所以我对任何事情感到满意> 25'000。
今天,构建以24'300 ops / s失败。当我使用Java 7(rc1,调试风格)运行测试时,我得到了5'000 ops / s。前者是好的,后者是测试必须抓住的红旗。
现在简单的解决方案是将我的目标降低到20'000,但我想知道如果机器可以负载,是否有更好的方法来定义性能测试的“安全范围”。
答案 0 :(得分:1)
我会不止一次地运行测试(例如,取11个结果并检查中位数,忽略性能的突然下降),或者在更长的时间内,这样你就可以得到更一致的结果。如果您无法控制服务器的负载,您可以在unix框上获得负载,并在确定合理范围时将其考虑在内。
答案 1 :(得分:1)
纯粹的ops / s数字孤立无意义。如果机器上的负载可能导致5倍的变化(100k低至20k),那么我肯定会掩盖应用程序行为的重大变化。
我认为你反复测试性能变化的理念是一个值得称道的想法,但除非你有一个可靠的平台,否则我不知道如何实现它。
我想您可以尝试衡量整体平台利用率并相应地调整您的测试结果,但可靠的模型肯定需要相当多的开发。
答案 2 :(得分:0)
不是测量挂钟时间,而是通过ThreadMXBean测量CPU时间。如果您希望支持50k ops /秒,那么每个操作都应该采用< 20,000纳秒。
我不知道是否可以通过这个bean访问垃圾收集器线程。如果没有,您需要通过GarbageCollectorMXBean
获取执行时间