gpt4 book ai didi

c++ - 短函数c++的执行时间

转载 作者:太空宇宙 更新时间:2023-11-04 16:11:00 25 4
gpt4 key购买 nike

我想计算一个非常小的函数的执行时间,以比较递归函数与迭代函数的执行时间。

当然,clock()没有足够的分辨率根本无法做到这一点。你能告诉我如何使用其他时间源,如 GetThreadTimes() .在微软网站上看到了描述,没看懂原理。

此外,<chrono> header 在 MS Visual 10 中不起作用。

代码:

int search (int a[], int size, int& num) {

if (size >0) {

if (a[size-1] == 17) {num = size-1; return num;}
else {return search (a, --size, num);}}
else {return num=-1;};
}

int searchit (int a[], int size, int& num) {

for (int i =0; i< size; i++) {
if (a[i] == 17) {num = i;}
else num = -1;
}
return num;}


int main () {
srand ((unsigned int) time(0));
int num = 0;
const int size = 40;
int a[size];
for (int i =0; i< size; i++) {

a[i] = rand()%100;
cout << a[i] << endl;}
cout << '\n';

search (a, size, num);

cout << num << endl;

cin.get();
cin.ignore();
}

最佳答案

一种解决方案是按照@amchacon 的建议进行多次迭代。这样做的优点是简单明了。

由于编译器对内联和/或指令流水线使用不同的启发式算法,以及由于在第一次迭代后指令和数据缓存都已预热,因此它的缺点可能导致结果不准确或不正确。
因此,虽然您的函数可能确实由于错误的内存访问模式而性能很差(可能导致两次缓存未命中,每次都花费您 500 个周期),但当您运行该函数一百次时,这可能根本不会显示,如果总计一组缓存行适合缓存。

有哪些替代方案?

a) 不适用于您的问题(因为您要测试递归算法),但无论如何我都会针对“一般”情况说明它:使用 IACA .它专为对一小部分代码进行微基准测试而设计,直至指令。

b) 使用更高精度的计时器或使用根本不是计时器的计时器。为此,您可以在 Windows 下使用 QueryPerformanceCounterQueryThreadCycleTime(Vista 和更高版本)。周期可能比时间更可取,具体取决于您要测量的内容。

c) 查询thread times .在我看来,这是最好的方法,因为您可以获得可靠、精确、准确的时间(与计时器非常不同,它可能包括上下文切换和在其他进程中花费的时间!),并且它适用于任何类型的代码,让您区分内核和用户时间,以防您的代码调用系统函数,并区分 CPU 和墙时间。
在运行您的函数之前和之后调用一次 GetThreadTimes 并减去相应的 UserTimeKernelTime 值。
或者,如果您也对 wall time 感兴趣(对于 wall time,您将从 ExitTime 中减去 CreationTime,并且您显然只得到一个有效的 ,则启动一个工作线程ExitTime 线程退出后!)。如果您的代码还涉及阻塞 I/O 操作,计算挂起时间可能会有用。

关于c++ - 短函数c++的执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28743893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com