确定排序算法所需时间的正确方法

时间:2012-03-05 03:00:33

标签: java algorithm sorting time

(使用Java)

我正在测试排序数组,以确定不同排序数组的速度。我想淘汰错误的时间,所以理想情况下我想启动一个计时器,在100次循环中运行排序,停止计时器,然后除以100得到一个非常准确的度量。

问题是如果我要循环同一个数组,它将在第一次正确排序,然后每次排序,它将继续排序已经排序的数组,这不是我想要的。

也许我错过了一个明显的解决方案,但有什么方法可以让它继续排序相同的初始随机数组?

我想过每次都会将新排序的数组重新分配回初始随机数组,但这会弄乱我的计时器..

感谢任何建议

我想做什么:

        startTime = System.nanoTime();
        for(int i=0; i<cntr; i++) {
            sort array
        }
        endTime = System.nanoTime();
        time = (endTime - startTime)/cntr;

6 个答案:

答案 0 :(得分:2)

您可以在开始排序之前制作副本,然后从存储的副本复制到循环的每次迭代中排序的数组中。

int[] toBeSorted = new int[10000];
// fill the array with data
int[] copied = new int[10000];
System.arrayCopy(toBeSorted, 0, copied, 0, copied.length);
// prepare the timer, but do not start it
for (int = 0 ; i != 100 ; i++) {
    System.arrayCopy(copied, 0, toBeSorted, 0, copied.length);
    // Now the toBeSorted is in its initial state
    // Start the timer
    Arrays.sort(toBeSorted);
    // Stop the timer before the next iteration
}

答案 1 :(得分:2)

您可以使用System.currentTimeMillis()方法获取当前时间,然后在方法完成执行时减去。

long totalRuntime = 0;

for(int i = 0; i < 100; i++)
{
   long startTime = System.currentTimeMillis();
   sortArrays()
   long endTime = System.currentTimeMillis();

   totalRuntime += (endTime - startTime);
}

System.out.println("Algorithm X on average took " 
                    + totalRuntime/100 + " milliseconds);

如果你想这样做X次,只需为每个算法和增量保留一个计数器。然后你可以除以最后的总运行数并进行比较。

答案 2 :(得分:1)

通常,您将在每次运行您正在测试的算法之间停止并启动计时器,将各个时间相加,然后除以运行次数。这样就不包括任何“设置时间”,因为在设置过程中计时器没有运行。

答案 3 :(得分:1)

用这样的东西

new array equals random array,
start timer
sort new array
stop timer
add time to your list of times
repeat until necessary

只要您每次都复制原始数组,就不会对原始数组进行排序

答案 4 :(得分:1)

将排序算法放在一个函数中,并一次又一次地使用相同的函数调用该函数,并在使用clone方法克隆它之后将数组传递给函数。 您可以调用当前时间函数并在每次运行循环时将其打印出来。

答案 5 :(得分:0)

如果您愿意发送内存,那么在开始计时之前,只需制作相同阵列的100个(或多个)副本。如果你不是,那么就一起排序和复制时间,然后再复制时间,看看大约有多少你的分类+复制时间用于复制。

此外,旁注:考虑使用像Caliper这样的基准测试框架,而不是进行自己的“手动”基准测试。它更容易,并且它们已经解决了许多您可能甚至不知道正在进行的问题,这可能会搞砸您的时间。