(使用Java)
我正在测试排序数组,以确定不同排序数组的速度。我想淘汰错误的时间,所以理想情况下我想启动一个计时器,在100次循环中运行排序,停止计时器,然后除以100得到一个非常准确的度量。
问题是如果我要循环同一个数组,它将在第一次正确排序,然后每次排序,它将继续排序已经排序的数组,这不是我想要的。
也许我错过了一个明显的解决方案,但有什么方法可以让它继续排序相同的初始随机数组?
我想过每次都会将新排序的数组重新分配回初始随机数组,但这会弄乱我的计时器..
感谢任何建议
我想做什么:
startTime = System.nanoTime();
for(int i=0; i<cntr; i++) {
sort array
}
endTime = System.nanoTime();
time = (endTime - startTime)/cntr;
答案 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这样的基准测试框架,而不是进行自己的“手动”基准测试。它更容易,并且它们已经解决了许多您可能甚至不知道正在进行的问题,这可能会搞砸您的时间。