排序时间总是与第一次排序不同

我写了几个排序算法。 我想比较他们的排序时间,至少差不多。 但是在第一次循环之后,所有排序时间都会减少,除了StoogeSort。 我认为在背景上有所优化,但我应该考虑采取哪些措施? 第一个还是其他? 为什么会发生这种情况?

public static void main(String[] args) { RandomNumber rn = new RandomNumber(); Scanner sc = new Scanner(System.in); while(true){ System.out.println("Enter the input size."); int n = sc.nextInt(); int[] experimentalArray = rn.experimentalArrayGenerator(n); Stopwatch sw1 = new Stopwatch(); StoogeSort ss = new StoogeSort(experimentalArray.clone()); System.out.println("StoogeSort : " + sw1.elapsedTime() + " µs"); Stopwatch sw2 = new Stopwatch(); RadixSort rs = new RadixSort(experimentalArray.clone()); System.out.println("RadixSort : " + sw2.elapsedTime() + " µs"); Stopwatch sw3 = new Stopwatch(); ShakerSort shs = new ShakerSort(experimentalArray.clone()); System.out.println("ShakerSort : " + sw3.elapsedTime() + " µs"); Stopwatch sw4 = new Stopwatch(); MaximumSubarray ms = new MaximumSubarray(); int a = ms.maxSubArraySum(experimentalArray.clone()); System.out.println("MaximumSubarray : " + sw4.elapsedTime() + " µs"); System.out.println("------------------------------------------------------"); } } 

4循环后输出:

在此处输入图像描述

微博标记是一个复杂的问题,因为许多因素会影响执行时间(例如Jon Skeet在评论中指出的即时编译和垃圾收集)。

如果您想了解如何进行微基准测试,您应该阅读Peter Sestoft的这份文件 。

在这里引用文档的摘要,因为文档是外部资源:

有时人们想要测量软件的速度,例如,衡量解决问题的新方法是否比旧方法更快。 进行这样的时间测量和微基准测试需要非常小心,特别是在Java虚拟机和Microsoft的公共语言基础结构(.NET)等托管平台上,否则结果可能是任意的和误导性的。

在这里,我们提供有关运行微基准测试的一些建议,特别是对于托管平台。 大多数示例都是Java,但建议适用于在托管平台上执行的任何语言,包括Scala,C#和F#。 此版本使用Javafunction接口,需要Java 8。