【问题标题】:Sorting time always different from first sort排序时间总是不同于第一次排序
【发布时间】:2017-03-24 15:29:00
【问题描述】:

我写了一对排序算法。我想比较他们的排序时间,至少差不多。但是在第一次循环之后,除了 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 次循环后的输出:

【问题讨论】:

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

标签: java sorting time-complexity


【解决方案1】:

微基准测试是一件复杂的事情,因为许多因素会影响执行时间(例如,Jon Skeet 在 cmets 中指出的即时编译和垃圾收集)。

如果您想了解应该如何进行微基准测试,您应该阅读 Peter Sestoft 的 this document

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

有时想要衡量软件的速度,例如, 衡量解决问题的新方法是否比旧方法更快 一。进行此类时间测量和微基准测试需要 相当谨慎,尤其是在 Java 等托管平台上 虚拟机和 Microsoft 的公共语言基础架构 (.NET), 否则结果可能是武断的和误导性的。

这里我们给出一些 关于运行微基准的建议,尤其是托管的 平台。大多数示例都使用 Java,但建议适用于任何 在托管平台上执行的语言,包括 Scala、C# 和 F#。 此版本使用 Java 功能接口,需要 Java 8。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    相关资源
    最近更新 更多