首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mergesort在更大的输入上运行得更快

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

Stack Overflow用户
提问于 2013-10-25 14:31:21
回答 1查看 713关注 0票数 2

我正在为学校做一个合并排序(排序字符串)的经验分析,我遇到了一个奇怪的现象,我无法解释或找到解释。当我运行我的代码时,我使用内置的system.nanotime()方法捕获运行时间,由于某种原因,在一定的输入大小下,执行排序例程所需的时间实际上要比使用更小的输入大小所花费的时间要少。

我的算法只是一个基本的合并排序,我的测试代码也很简单:

代码语言:javascript
复制
//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个字符长,杂乱(随机顺序)

我有遗漏什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-25 14:48:47

我有遗漏什么吗?

您正在尝试做一个microbenchmark,但是到目前为止您发布的代码并不像一个工作良好的示例。要做到这一点,请遵循这里规定的规则:How do I write a correct micro-benchmark in Java?

对代码速度更快的解释是,在对方法进行一些迭代之后,JIT将触发,代码的性能将得到优化,因此即使在处理更大的数据时,代码也会变得更快。

一些建议:

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19592653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档