Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 测量运行时间-不够精确_C++_Sorting_Runtime_Mergesort_Chrono - Fatal编程技术网

C++ 测量运行时间-不够精确

C++ 测量运行时间-不够精确,c++,sorting,runtime,mergesort,chrono,C++,Sorting,Runtime,Mergesort,Chrono,我在这里有个任务。编程方面应该相对简单,但我似乎无法在这里得到结果。我们将实现合并排序和基数排序,然后在随机数组上测试它们。在n=10、n=100、n=1000和n=10000的情况下对其进行十次测试,取十次测试的平均值以获得平均运行时间。听起来很简单,但对于n=10我似乎无法得到任何结果,对于n=100和n=1000的结果也不是很精确。我能从中得到的最多是.0001 任务的重点是将这些运行时与理论运行时进行比较,但我们从来没有讨论过如何获得运行时,因此我们中的任何人都能做的就是毫无目的地搜索G

我在这里有个任务。编程方面应该相对简单,但我似乎无法在这里得到结果。我们将实现合并排序和基数排序,然后在随机数组上测试它们。在n=10、n=100、n=1000和n=10000的情况下对其进行十次测试,取十次测试的平均值以获得平均运行时间。听起来很简单,但对于n=10我似乎无法得到任何结果,对于n=100和n=1000的结果也不是很精确。我能从中得到的最多是.0001

任务的重点是将这些运行时与理论运行时进行比较,但我们从来没有讨论过如何获得运行时,因此我们中的任何人都能做的就是毫无目的地搜索Google,希望找到一些有效的运行时

我尝试过几种不同的方法,但都没有产生足够的效果。最近的尝试是使用chrono和高分辨率时钟。还是不行。我甚至试着对我的电脑进行压力测试,并在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;

不要在单个阵列上使用10个循环,而是使用10个阵列即使10个10000个阵列也不会成为内存使用的问题。用随机数填充10个数组,然后调用mergesort 10次,对10个数组中的每个数组进行排序。这会有点帮助。然而,即使这样也可能不够。我使用更大的阵列进行了一些测试:

对psuedo随机数据的4194304 64位元素进行排序的时间:

radix sort     203 ms
merge sort     297 ms
64位模式,Windows XP64,Visual Studio 2005编译器。英特尔i7 2600K 3.4ghz,DP67BG主板,4GB ram

您可以使用更多的数组,但是如果数组的数量很大,那么调用开销就会成为一个因素。基数排序在时间上是线性的,而合并排序在log2n上。您可以测试较大的阵列,然后使用公式估计小阵列的时间


对于更高精度的计时器,您可以使用X86 rdtsc指令汇编或内部指令(如果编译器支持)获取cpu周期计数。由于这是一个周期计数,如果cpu具有自动超频模式(如Intel的turbo boost),则不会受到影响。

使用std::chrono::super\u duper\u高分辨率时钟;我很惊讶老师会期望你从低至10、100甚至1000的n值中得到可测量的数字。我会让你从10公里或更高的起跑点开始。我正说到这一点。哈哈,我不只是测量整个for循环的唯一原因是我每次都要测量填充向量的时间,这会扭曲结果;我将它们全部更改为auto duration=std::chrono::durationt1-t2.count;得到了一些奇怪的结果:对于N=10,Mergesort平均运行时间:0对于N=100,Mergesort平均运行时间:0对于N=1000,Mergesort平均运行时间:-0.0006对于N=10000,Mergesort平均运行时间:-0.0036002我是时间旅行吗?我已经尝试过了。我甚至把它增加到了20个数组,但对于n=10或n=100,我仍然没有得到结果。老实说,我不知道从哪里开始你的X86建议,我敢打赌这确实有点超出了这个类的范围。“我得等教授回来,看看他有什么要说的。@Shoggoth269当你这么做的时候,为了完全公平,每个样本数据集在提交给每个算法时,都应该以原始随机顺序相同。”。即,每个样本大小生成一次数据,制作一个备份副本,然后为每个算法复制一个要排序的备份数据数组,然后对数据进行b排序。这是唯一一种不会因为算法的每次更改而在prng上下赌注的方法。@Shoggoth269-Microsoft编译器内部版本:,GCC编译器示例: