如何知道在 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++ 中计算算法的执行时间?的主要内容,如果未能解决你的问题,请参考以下文章
在 python 中计时时,我应该如何考虑 subprocess.Popen() 开销?