【问题标题】:Computing time reduced after iterations迭代后计算时间减少
【发布时间】:2014-07-16 05:45:11
【问题描述】:

我正在做关于排序算法效率的项目。假设我执行了 50 次冒泡排序迭代并找到 n 个数字所花费的平均时间。但我意识到前几次迭代总是比后续迭代慢

例如1394ms、1381ms、1001ms、1008ms、1008ms、1011ms...

        long lStartTime = System.currentTimeMillis();
        bubbleSort(R); // R is the array of int
        long lEndTime = System.currentTimeMillis();
        long difference = lEndTime - lStartTime;

这背后的原因可能是什么?是因为cpu能分辨出哪组数据要存入缓存吗? 如果是这样,我是否应该不使用后续计算时间进行分析,因为它不现实?

谢谢!

编辑:我也在做其他排序算法,以冒泡排序为例,但问题是它发生在我所做的所有排序中,除了插入之外

public static int[] bubbleSort(int[] S) {
    int counter = 0;
    boolean isUnsort = true;
    while (isUnsort) {
        isUnsort = false;

        for (int i = 0; i < S.length - 1 - counter; i++) {
            if (S[i] > S[i + 1]) {
                int temp = S[i];
                S[i] = S[i + 1];
                S[i + 1] = temp;
                isUnsort = true;
            }

        }
        counter++;
    }
    return S;
}

【问题讨论】:

  • 您的冒泡排序实现如何?冒泡排序可以提供 O(R) 到 O(R2) 之间的效率
  • 这可能是由于Java中的JIT编译导致了这种情况。 JIT。但是,您的数组数据 R 是常数吗?不同的输入会产生不同的排序时间。
  • 添加了冒泡排序代码。 R 大小是恒定的,数据是用 Math.random() 生成的。但总是前几次迭代比后续迭代慢,所以我怀疑这是由于输入
  • @RenFaKay JIT 应该是前几次迭代需要更长输入的原因。建议将它们过滤掉以进行计算。由于输入是随机的,因此计算时间也可能不同。

标签: java cpu-speed


【解决方案1】:

这可能是即时编译器将您的字节码转换为更有效的形式。我建议您在开始计时之前至少进行一次(但最好是几次)热身活动。此外,冒泡排序是一种非常低效的排序方式。

【讨论】:

  • mmm 在阅读了 JIT 之后,我想这是因为它而不是缓存。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
  • 2016-06-06
  • 1970-01-01
  • 2020-12-06
相关资源
最近更新 更多