繁体   English   中英

Java算法时间量度

[英]Java Algorithm time measure

我的问题是,当我尝试准确测量算法执行时间时,一旦完成第一组测试,结果就会大不相同。

我有7个带整数的文本文件,每个文本文件都有两个元素的幂。

2 4 = 16
2 8 = 256
2 12 = 4096
2 16 = 65536
2 20 = 1048576
2 22 = 4194304
2 24 = 16777216

我将这些测试运行X次以获得执行时间。 一个测试用例被认为一次执行了所有上述测试。 我做了几次,而没有更改文本文件数据。

要测量我的算法执行时间,请使用System.nanoTime();

        long start = System.nanoTime();
        (Algorithm)
        long elapsedNanoTime = System.nanoTime() - start;

但是,结果显示在执行第一个测试用例之后,开始测试16和256的下降幅度很大。

测试用例,迭代1:

16个元素需要325336n
256个要素为414861n
4096个元素需要2061728n
65536个元素需要21111426n
1048576个元素需要326898979n
4194304个元素需要1487154649n
16777216个元素需要6700800203n

测试用例,迭代2:

16个元素需要2925n
256个元素需要36864n
4096个元素需要885603n
65536个元素需要15839933n
1048576个元素需要332000198n
4194304个元素需要1484967410n
16777216个元素需要6695675287n

测试用例,迭代3:

16个元素需要2926n
256元素需要35985n
4096个元素需要679635n
65536个元素需要15462227n
1048576个元素需要328179551n
4194304个元素需要1483733064n
16777216个元素需要6704160641n

如果我分别运行每个测试用例,“编译”该程序以仅进行7个测试,则结果将像上面的迭代1一样出来。

那么,对于为什么执行时间与第一个测试用例及其他用例不同的人,有没有人有见识? 它与程序的初始化有关,还是内存已经在某处分配了数据? 因为到目前为止,我不确定哪个执行时间数据正确。

提前致谢。

基准测试很困难,您偶然发现了最常见的麻烦案例之一。 JIT编译器 JVM是编译一些运行作为其运行的代码,以进一步优化比字节码编译器本身可希望做的实际负责。

描述如何确保基准测试的准确性超出了答案的范围(但是有很多资源 ),但是对于此特定问题,您想要做的是多次运行基准测试(在同一JVM中),并丢弃前几个作为噪音运行。 一旦运行了几次基准测试,JIT将有机会为您优化代码,并且可能不会在连续运行中进行更多优化。

考虑使用jmh作为微基准测试的框架。 正如@ dimo414的答案中指出的那样,基准测试在JVM上很困难。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM