我有一段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由于您看到冒泡排序的运行时间不正确,因此它应该大于此类数组的合并排序的运行时间。
感谢你的帮助。
发布于 2020-06-19 22:38:46
可能你以后的迭代是在第一次迭代时对已经排序的数组进行排序,如果你在没有交换的版本上使用提前输出, BubbleSort在这种情况下是很快的。MergeSort是恒定的时间,并且总是做相同的工作量,即使对于排序的输入也是如此。
对反转数组的副本进行排序。
将输入复制几次,与扫描一次相比,大约有20倍的性能差异。(排序输入上的MergeSort可能退化为复制全部一半,然后复制全部另一半。在越来越小的块中,所以在某个时刻,它们开始适合L2,然后是L1d缓存,如果我们谈论的是In而不是字符串。)
由于分支预测,第一个算法后的运行时间计算不正确。
这听起来不太可能。它可以不同于稳态情况,但分支预测可以“学习”和“记住”的模式数量应该是200000排序中的一小部分。
更有可能的是,第一次迭代很慢,因为其他预热效果,如JIT编译,CPU频率还没有从空闲增加到最大。
参见Idiomatic way of performance evaluation?。如果您要在每次迭代中丢弃已排序的副本,请确保时间仍然合理;如果优化器太聪明,它可能会通过不做任何工作来生成没有任何东西使用的结果数组来击败您的基准测试。
https://stackoverflow.com/questions/62471235
复制相似问题