Mergesort在更大的输入上运行得更快

时间:2013-10-25 14:31:21

标签: java sorting mergesort

我正在为学校进行合并排序(排序字符串)的实证分析,我遇到了一个奇怪的现象,我无法解释或找到解释。当我运行我的代码时,我使用内置的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个项目几乎不会很大。

一些信息:

  • 编译器:Java版本1.7.0_07
  • 算法:基本递归合并排序(使用数组)
  • 输入类型:字符串长6-10个字符,随机播放(随机顺序)

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

  

我错过了什么吗?

你正在尝试microbenchmark,但到目前为止你发布的代码并不像一个运行良好的样本。为此,请遵循此处所述的规则:How do I write a correct micro-benchmark in Java?

关于代码更快的解释是因为在方法的一些迭代之后,JIT将触发并且代码的性能将得到优化,因此即使处理更大的数据,代码也会变得更快。

一些建议:

  • 使用不同大小的多个数组/列表输入。进行这种分析的好的值是100,1000(1k),10000(10k),100000(100k),1000000(1m)以及它们之间的随机大小值。在执行需要更长时间的评估时,您将获得更准确的结果。
  • 使用不同对象的数组/列表。创建POJO并使其实现Comparable接口,然后执行排序方法。如上所述,使用不同的数组值。

与您的问题没有直接关系,但执行结果基于使用的JDK。 Eclipse只是一个IDE,可以使用不同的JDK版本,例如在我的工作场所,我使用JDK 6 u30来处理公司的项目,但对于个人项目(如概念证明),我使用的是JDK 7 u40。