我正在为学校进行合并排序(排序字符串)的实证分析,我遇到了一个奇怪的现象,我无法解释或找到解释。当我运行我的代码时,我使用内置的system.nanotime()方法捕获运行时间,并且出于某种原因,在某个输入大小下,执行排序例程实际上需要更少时间。输入尺寸较小。
我的算法只是一个基本的合并排序,我的测试代码也很简单:
//Get current system time
long start = System.nanoTime();
//Perform mergesort procedure
a = q.sort(a);
//Calculate total elapsed sort time
long time = System.nanoTime()-start;
排序900个字符串时经过的时间输出为:3928492ns 对于1300个字符串,它是:3541923ns
这两项都是大约20项试验的平均值,所以它非常一致。在1300个字符串之后,执行时间继续按预期增长。我想可能会有一些峰值输入大小,这种现象最明显。
所以我的问题:可能导致程序速度突然增加的原因是什么?我想可能会对包含大量数据的数组进行某种优化,尽管数组中的1300个项目几乎不会很大。
一些信息:
我错过了什么吗?
答案 0 :(得分:0)
我错过了什么吗?
你正在尝试microbenchmark,但到目前为止你发布的代码并不像一个运行良好的样本。为此,请遵循此处所述的规则:How do I write a correct micro-benchmark in Java?。
关于代码更快的解释是因为在方法的一些迭代之后,JIT将触发并且代码的性能将得到优化,因此即使处理更大的数据,代码也会变得更快。
一些建议:
Comparable
接口,然后执行排序方法。如上所述,使用不同的数组值。与您的问题没有直接关系,但执行结果基于使用的JDK。 Eclipse只是一个IDE,可以使用不同的JDK版本,例如在我的工作场所,我使用JDK 6 u30来处理公司的项目,但对于个人项目(如概念证明),我使用的是JDK 7 u40。