使用System.nanoTime()对不同长度的插入进行计时

时间:2019-05-07 23:55:18

标签: java arrays timing insertion-sort nanotime

在Java中,我有一些代码可以对一次插入排序的10次尝试进行计时。它对相同的数组进行排序,但最多100个单词,200个单词等,直到on数组的完整长度。下面的代码分别用于100个和200个单词,但是在更改了变量的情况下,它们看起来都一样。

但是,下一个平均时间似乎越来越短。例如。 100个单词为9658233ns,200个单词为4273459ns,300个单词为3716726ns,400个单词为2965091ns,459个单词为2842528ns。但是,如果我颠倒顺序,则首先对整个数组进行排序,最后对100个单词的数组进行排序,则对整个数组进行排序的时间最长,而对100个单词的数组进行排序的时间最短。

使用不同的时间对插入排序进行计时会导致我获得更一致的结果吗?

    long i1AverageTime = 0L;
    for (int i = 0; i < 10; i++) {
        long start = System.nanoTime();
        insertionSort(myArray, 100);
        long end = System.nanoTime();
        long timeTaken = end - start;
        i1AverageTime += timeTaken;
    }
    i1AverageTime /= 10;

    long i2AverageTime = 0L;
    for (int i = 0; i < 10; i++) {
        long start = System.nanoTime();
        insertionSort(myArray, 200);
        long end = System.nanoTime();
        long timeTaken = end - start;
        i2AverageTime += timeTaken;
    }
    i2AverageTime /= 10;

1 个答案:

答案 0 :(得分:1)

使用计时方法进行算法分析确实是判断算法性能的一种困难方法,尤其是在个人或学校使用的笔记本电脑或机器上。

您可能会遇到不稳定的原因有很多:

  1. 您的计算机的处理速度可能会在运行的每一秒发生变化。诸如Web浏览器,防病毒程序和其他后台进程之类的事情正在影响您拥有多少处理能力,从而影响您运行算法的能力。
  2. 内存也是如此。您的RAM使用率和内存可用性一直在变化,并且非常不稳定,因此使用它来衡量性能不是一个安全的指标。

衡量算法性能的一种更准确的方法是将算法的运行时复杂度与已知复杂度(通常为O(n)O(n^2))进行比较。