测量运行时间 - 不够精确

时间:2014-08-01 06:23:51

标签: c++ sorting runtime mergesort chrono

我在这里得到了一份任务。它的编程方面应该相对简单,但我似乎无法在这里获得结果。我们将实现合并排序和基数排序,然后在随机数组上测试它们。对n = 10,n = 100,n = 1000和n = 10000进行十次测试,平均十次测试中的每一次以获得平均运行时间。听起来很简单,但我似乎无法获得n = 10的任何结果,而n = 100和n = 1000的结果并不是非常精确。我能从他们身上得到的最多就是.0001。

分配的目的是将这些运行时间与理论运行时间进行比较,但我们从未讨论过如何处理运行时,所以我们中任何人都可以做的就是漫无目的地希望找到一些东西。的工作原理。

我尝试了几种不同的方法,但没有一种方法能够产生足够的效果。最近的尝试是使用chrono和high_resolution_clock。仍然没有好处。我甚至尝试将我的计算机置于压力测试状态并运行程序,同时负载大约为100%,但仍然没有工作。

for(int cnt = 0; cnt < 10; cnt++)
{
    populate(numbers, 10);
    high_resolution_clock::time_point t1 = high_resolution_clock::now();
    mergeSort(numbers,0,numbers.size()-1);
    high_resolution_clock::time_point t2 = high_resolution_clock::now();

    auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(t2-t1).count();
    dur += duration;
}

cout << endl << "For N = 10, Mergesort Average Runtime: " << dur/10;
dur = 0;

1 个答案:

答案 0 :(得分:0)

而不是单个阵列上的10个循环,使用10个阵列(甚至10个阵列的10,000韩元也是内存使用的问题)。使用随机数填充10个数组,然后调用mergesort()10次以对10个数组中的每个进行排序。这会有所帮助。但是,即使这可能还不够。我用更大的数组进行了一些测试:

对psuedo随机数据的4,194,304 64位元素进行排序的时间:

radix sort     203 ms
merge sort     297 ms

64位模式,Windows XP64,Visual Studio 2005编译器。 Intel i7 2600K 3.4ghz,DP67BG主板,4GB内存

您可以使用更多数组,但如果数组的数量很大,那么调用开销就成了一个因素。基数排序在时间O(n)中是线性的,而合并排序是O(n log2(n))。您可以测试更大的数组,然后使用公式来估计小数组的时间。

对于更高精度的计时器,您可以使用X86 rdtsc指令(程序集)获取cpu循环计数,如果编译器支持,则可以获取内部计数。由于它是一个循环计数,如果cpu具有自动超频模式,例如英特尔的涡轮增压,它不会受到影响。