短函数c++的执行时间

Execution time of a short function c++

本文关键字:执行时间 c++ 函数      更新时间:2023-10-16

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

毫无疑问,clock()在没有足够分辨率的情况下根本无法做到这一点。你能告诉我如何使用像GetThreadTimes()这样的其他时间源吗。我在微软网站上看到了一个描述,但没有领会其中的原理。

此外,<chrono>标头在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的建议进行多次迭代。这具有简单明了的优点。

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

有哪些替代方案

a) 不适用于您的问题(因为您想测试递归算法),但我无论如何都会为"一般"情况声明:使用IACA。它是专门为微观基准测试而设计的,从一小段代码一直到指令。

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

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

只需进行100次搜索并取平均值:

    time_t begin,end,total;
    const int iterations = 100;
    begin = clock();
    for (int i = 0;i<iterations;i++)
     search (a, size, num);
    end = clock();
    total = (end-begin)/static_cast<double>(CLOCKS_PER_SEC);
    cout<<"Average time for "<<iterations<<" iterations: "<<total/iterations<<endl;

编译器将展开循环:)。无论如何,For循环的消耗是可以忽略不计的。