我正在为学校做一个合并排序(排序字符串)的经验分析,我遇到了一个奇怪的现象,我无法解释或找到解释。当我运行我的代码时,我使用内置的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项并不大,但是数组中包含更多数据的数组可能正在进行某种优化。
一些信息:
我有遗漏什么吗?
发布于 2013-10-25 14:48:47
我有遗漏什么吗?
您正在尝试做一个microbenchmark,但是到目前为止您发布的代码并不像一个工作良好的示例。要做到这一点,请遵循这里规定的规则:How do I write a correct micro-benchmark in Java?。
对代码速度更快的解释是,在对方法进行一些迭代之后,JIT将触发,代码的性能将得到优化,因此即使在处理更大的数据时,代码也会变得更快。
一些建议:
Comparable接口,然后执行您的排序方法。如上所述,使用不同的数组值。与您的问题没有直接关系,但是执行结果基于所使用的JDK。Eclipse只是一个IDE,可以使用不同的JDK版本,例如,在我的工作场所,我使用JDK 6 u30来处理公司的项目,但是对于个人项目(如概念证明),我使用JDK 7 u40。
https://stackoverflow.com/questions/19592653
复制相似问题