【问题标题】:Timing bubble sorting in different scenarios不同场景下的时序冒泡排序
【发布时间】:2016-10-17 20:07:50
【问题描述】:

我正在尝试在三种不同的输入中确定冒泡排序算法的运行时间:

1) 随机选择的数字
2) 已排序的数字
3) 以倒序号排序

我对他们的运行时间的期望是:

倒序数字比其他两个数字需要更长的时间。
已经排序的数字将具有最快的运行时间。
随机选择的数字将介于这两者之间。

我已经使用包含超过 100.000 个数字的输入测试了该算法。结果并不像我预期的那样。已经排序的数字具有最快的运行时间,但随机选择的数字的执行时间几乎是反向排序数字的两倍。我想知道为什么会这样?

这是我测试输入的方法

    int[] random = fillRandom();
    int[] sorted = fillSorted();
    int[] reverse = fillReverse();

    int[] temp;
    long time, totalTime = 0;

    for (int i = 0; i < 100; i++) {
        temp = random.clone();
        time = System.currentTimeMillis();
        BubbleSort.sort(temp);
        time = System.currentTimeMillis() - time;
        totalTime += time;
    }
    System.out.println("random - average time: " + totalTime/100.0 + " ms");

    totalTime = 0;
    for (int i = 0; i < 100; i++) {
        temp = sorted.clone();
        time = System.currentTimeMillis();
        BubbleSort.sort(temp);
        time = System.currentTimeMillis() - time;
        totalTime += time;
    }
    System.out.println("sorted - average time: " + totalTime/100.0 + " ms");

    totalTime = 0;
    for (int i = 0; i < 100; i++) {
        temp = reverse.clone();
        time = System.currentTimeMillis();
        BubbleSort.sort(temp);
        time = System.currentTimeMillis() - time;
        totalTime += time;
    }
    System.out.println("reverse - average time: " + totalTime/100.0 + " ms");

【问题讨论】:

  • 试图以这种方式对 Java 代码进行计时将产生有效的无用结果。有关如何正确执行此操作的一些信息,请参阅this question
  • 使用热身,即在不计时的情况下运行排序 100 次,然后慢慢来。对每个变体独立执行此操作,即不是一个接一个。关闭 GC。即使那样,结果也可能违反直觉。可以帮助解释逆序情况的一件事是branch prediction

标签: java algorithm sorting


【解决方案1】:

Java 代码的基准测试并不容易,因为 JVM 可能会在运行时对您的代码进行大量优化。如果不使用计算结果,它可以优化一个循环,它可以内联一些代码,JIT 可以将一些代码编译成本机等等。因此,基准输出非常不稳定。

jmh 之类的工具可以大大简化基准测试。

我建议你查看this article,它有一个排序算法基准的示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 2013-10-09
    • 2021-04-26
    • 2019-04-21
    相关资源
    最近更新 更多