如何知道在 C++ 中计算算法的执行时间?

Posted

技术标签:

【中文标题】如何知道在 C++ 中计算算法的执行时间?【英文标题】:How to know calculate the execution time of an algorithm in c++? 【发布时间】:2009-12-22 22:57:20 【问题描述】:

我想通过查看算法的运行时性能来测试哪种数据结构最好,我该怎么做?

例如我已经有一个hashmap<string, int> hmp;假设我的hashmap 中有"apple" 我想知道执行以下语句需要多长时间:hmp["apple"]

我该如何计时?

谢谢!

【问题讨论】:

测试单个查找完全没有意义。 【参考方案1】:

首先看看我对this question的回复;它包含一个可移植的(windows/linux)函数来获取以毫秒为单位的时间。

接下来,做这样的事情:

int64 start_time = GetTimeMs64();
const int NUM_TIMES = 100000; /* Choose this so it takes at the very least half a minute to run */

for (int i = 0; i < NUM_TIMES; ++i) 
   /* Code you want to time.. */


double milliseconds = (GetTimeMs64() - start_time) / (double)NUM_TIMES;

全部完成! (注意我没试过编译)

【讨论】:

选择代码到时间也是很敏感的。编译器可以优化掉所有的迭代。 这个不编译不知道int64是什么?我必须包括一些东西吗?【参考方案2】:

您可以调整程序以执行数千或数百万个 hashmap 查找,理想情况下是随机选择的,并计时。

【讨论】:

【参考方案3】:

如果您真的想在数据结构之间做出决定,您需要设计一个至少近似于您将如何使用该结构的测试。一些结构对少量数据表现更好,一些结构对大量数据表现更好。有些在您进行大量读取时表现更好,有些在您进行大量插入/写入时表现更好。有些在几乎完全相同的数据上表现更好,有些在非常不同的数据上表现更好。有些算法如果只执行一次,性能会更好,而另一些算法如果执行一百万次,性能会更好,因为它们具有更好的代码局部性,使得缓存命中的可能性更大。我的意思是,祝你好运:)

【讨论】:

【参考方案4】:

您可以考虑将数据绘制成图表并导出其(数学)函数。运行一些试验,例如 10、100、1000、10000 和 100000 次迭代。使用迭代次数作为 x 变量并将结果时间作为 y 变量,绘制图表。从中您可以确定描述代码性能的函数,使用线性回归(也称为软件中的曲线拟合) - 我使用 Graphical Analysis 为此。

使用其他数据结构/代码重复试验并执行相同的图形过程,然后比较您的图形和函数。

您还可以使用此数据来确定每个数据结构的有效 Big O 时间复杂度。

【讨论】:

以上是关于如何知道在 C++ 中计算算法的执行时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Slick 2.0 中计数(*)?

在 python 中计时时,我应该如何考虑 subprocess.Popen() 开销?

编一个C++程序 创建一个选择排序法的函数模板sort 并在main()执行

如何在 Hadoop 中计数? [复制]

如何在 Python 中计算学生化残差?

如何在应用程序中计费