Java 排序时间始终不同于第一次排序

Java 排序时间始终不同于第一次排序,java,sorting,time-complexity,Java,Sorting,Time Complexity,我写了一些排序算法。我想比较一下他们的排序时间,至少差不多。但在第一次循环之后,除StoogeSort外,所有排序时间都在减少。我认为在背景上有一些优化,但我应该考虑哪些措施呢?第一个还是其他的?为什么会这样 public static void main(String[] args) { RandomNumber rn = new RandomNumber(); Scanner sc = new Scanner(System.in); while(true){

我写了一些排序算法。我想比较一下他们的排序时间,至少差不多。但在第一次循环之后,除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。 此版本使用Java功能接口,需要Java 8


排序随机数数组几乎不会花费同样的时间。但这很奇怪。仅第一个不同于其他数组。以数组[1,2,3,4,5,6,7,8,9,10]为例。一个算法需要多少时间来排序?然后考虑数组[10,5,3,7,2,8,1,9,6,4]。这会花费相同的时间吗?除此之外,第一个执行路径将涉及不同的JITting,很可能是不同的GC体验等。