【问题标题】:java code to calculate running time for sorting algorithms [duplicate]java代码计算排序算法的运行时间[重复]
【发布时间】:2020-10-09 18:21:46
【问题描述】:

我有一个 java 代码可以计算多种排序算法的运行时间,例如“合并排序、冒泡排序等..”。

由于分支预测,第一个算法后的运行时间计算不正确。那么无论如何要避免分支预测以获得正确的运行时间。

Example:Running time for revers sorted array with length 200000 index is as below:
Average runtime for Merge Sort in seconds after 10 iteration is : 0.0204354182
Average runtime for Bubble Sort in seconds after 10 iteration is : 1.0596160000000001E-4

如你所见,冒泡排序的运行时间不正确,它应该超过该数组的归并排序的运行时间。

感谢您的帮助。

【问题讨论】:

  • 你试过使用timer吗?
  • 参考this post了解JMH基准。
  • 谢谢@user7 将尝试根据您的评论更改代码。

标签: java algorithm branch-prediction


【解决方案1】:

可能您以后的迭代正在对第一次迭代产生的已排序数组进行排序。如果您使用无交换版本的早期输出,那么在这种情况下,BubbleSort 会很快。 MergeSort 是恒定的时间,并且总是做相同数量的工作,即使对于已排序的输入也是如此。

对反转数组的副本进行排序。

在输入周围复制几次听起来与扫描一次相比,性能相差 20 倍。 (排序输入上的 MergeSort 可能退化为复制所有一半,然后复制所有另一半。在越来越小的块中,所以在某些时候它们开始适合 L2,然后是 L1d 缓存,如果我们谈论的是 ints 不是字符串。)

由于分支预测,第一个算法后的运行时间计算不正确。

这听起来不太可能。它可能与稳态情况不同,但分支预测可以“学习”和“记住”的模式数量应该是 200000 排序的一小部分。

第一次迭代很可能很慢,因为 JIT 编译等其他预热效应,以及 CPU 频率尚未从空闲上升到最大值。

Idiomatic way of performance evaluation?。如果您每次迭代都丢弃排序后的副本,请确保时间仍然合理;如果优化器太聪明,它可能会通过简单地不做任何工作来生成一个从未使用过的结果数组来击败您的基准。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-22
    • 2021-03-22
    • 2020-07-22
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多