用时钟测量程序的运行时间

Posted

技术标签:

【中文标题】用时钟测量程序的运行时间【英文标题】:Measuring running time of program with clock 【发布时间】:2020-02-17 15:19:21 【问题描述】:

我们正在研究各种排序算法的性能,并实现了我们的归并排序版本。我们试图用不同的输入来测量运行时间,但是当我们运行如下所示的 main() 程序时,我们得到了不同的时间结果。

例如,下面的clock()函数输出在大输入时可以显示30秒,但是当我们使用手机使用实际计时器时,主程序大约需要2分钟。

我们在这里缺少什么?我们没有以正确的方式使用clock()函数吗?为什么会有这么大的差异(1.5 分钟)?

谢谢

int n;
cout << "Enter n - lenght of array" << endl;
cin >> n;

vector<int> v(n);

for(int i = 0; i < n; ++i)

    v[i] = i;


auto rng = default_random_engine ;
std::shuffle(std::begin(v), std::end(v), rng);

clock_t begin = clock();

sort(v);

cout << "done";

clock_t end = clock();

cout <<"total time : " << (double)(end-begin) / CLOCKS_PER_SEC<<endl;

return 0;

【问题讨论】:

我看不出它会造成 90 秒的差异,但 shuffle 需要多长时间? 您是在用手机测量整个程序的执行情况,还是只是排序?由于您只测量排序,因此使用clock 除了已经提到的 - 我认为 - 使用 clock() 你测量 CPU 时间,而不是挂钟时间。这意味着您的程序可以运行 2 分钟,但实际上它只使用 cpu 1 分钟左右。还要确保您正在运行优化的构建。 相关:***.com/questions/2808398/easily-measure-elapsed-time n 在你的测试中有多大?您不会按值将该向量传递给您的排序函数,是吗? 【参考方案1】:

我通过将sort 函数替换为std::sort 来运行您的代码,对于n=5000000 它显示11.744s 然后我在vector v 的声明之前移动了clock_t begin = clock(); 行,时间是@987654327 @

看来内存分配,O(N) 初始化和洗牌可能会花费大量时间,如果您为n 选择更大的数字,具体取决于您的@ 效率987654329@ 用于随机输入集的函数,初始化可能比排序花费更多时间。

【讨论】:

以上是关于用时钟测量程序的运行时间的主要内容,如果未能解决你的问题,请参考以下文章

如何测量 C# 控制台应用程序运行时间?

测量程序运行时间

单片机测量代码运行时间方法-STM32

单片机测量代码运行时间方法-STM32

单片机测量代码运行时间方法-STM32

如何测量在 ubuntu 上运行的 java 应用程序的 I/O 时间?