【发布时间】:2016-06-27 21:43:30
【问题描述】:
作为学校练习的一部分,我想将排序算法作为 Java 练习进行比较和对比。
我自己实现了排序算法,我们对实现 Comparable 接口的类 Person 的对象进行排序。
到目前为止一切都很好,但我无法解释的是为什么在第一次调用我的排序方法时,排序时间比后续调用要长?
下面的输出代表我的结果。
Best、Worst 和 Avg 指的是传递给排序方法的未排序数组:
- 最好:数组已经排序
- 最差:数组倒序排列
- 平均:数组中的对象是随机顺序的
这是我的输出:
1-call of the sorting methods
InsertionSort Best:1799ms Worst:78ms Avg:789ms
MergeSort Best:10ms Worst:3ms Avg:5ms
2-call of the sorting methods
InsertionSort Best:1065ms Worst:39ms Avg:691ms
MergeSort Best:3ms Worst:2ms Avg:5ms
3-call of the sorting methods
InsertionSort Best:1066ms Worst:39ms Avg:692ms
MergeSort Best:3ms Worst:2ms Avg:5ms
4-call of the sorting methods
InsertionSort Best:1065ms Worst:39ms Avg:691ms
MergeSort Best:3ms Worst:2ms Avg:5ms
JVM 是否对后续调用进行任何优化?
我很困惑,非常感谢任何帮助!
编辑:感谢到目前为止的建议和回答!
澄清几点 - 我的输出中的每个调用都指的是完成排序所需的时间!
每次排序后,我都会再次使用 UNSORTED 数组进行新调用!
我的源代码可以作为 Eclipse 项目的 zip 文件下载,位于以下 Dropbox 链接: dropbox link to eclipse project.zip
附:我没有使用探查器的经验 - 如果你能指点我一个教程,那就太好了。
【问题讨论】:
-
能贴出代码吗?
-
您是否在运行之间重新洗牌?
-
这个没有代码很难说;例如;这可能取决于你如何测量。在绩效衡量方面,人们可能会遇到很多陷阱。例如,有时 Java 即时编译器会做一些有趣的事情。
-
我建议使用 Profiler。
-
嗨 - 是的,我在运行之间重新洗牌
标签: java performance sorting time profiling