如何测量C中循环中几个函数的执行时间

时间:2014-01-06 09:57:29

标签: c performance-testing

我希望找到一种方法来测量C中for循环中几个函数的执行时间。例如,有如下代码:

for(;;)
{
    func1();
    func2();
    func3();
}

我想知道程序在func1()(或func2,func3)上完全花费了多少时间。

我知道我可以使用clock()来测量时间。但是,在这种情况下,如果我写代码如下:

for(;;)
{
    a = clock();
    func1();
    b = clock();
    time_func1 += (b-a);
    a = clock();
    func2();
    b = clock();
    time_func2 += (b-a);
    a = clock();
    func3();
    b = clock();
    time_func3 += (b-a);
}

看起来太傻了,结果不准确。

5 个答案:

答案 0 :(得分:3)

如果您使用的是Linux,我建议您使用clock_gettime。这样可以使用多个时钟进行精确的时间测量,同时具有高分辨率clock本身的分辨率很低。

也许关于它的用法:

timespec t1, t2;

clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &t1);
/* CODE TO BE MEASURED */
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &t2);

答案 1 :(得分:1)

clock()的分辨率非常低。根据您的操作系统,有更准确的功能。

在Windows中有QueryPerformanceCounters

答案 2 :(得分:1)

如果存在多线程代码,

clock()也不会给出真正的执行时间。

答案 3 :(得分:0)

塞巴斯蒂安是对的,

根据手册页,POSIX函数clock()返回程序使用的时钟滴答(它们的近似值是什么意思?)的近似值。您必须除以每秒钟数才能获得执行时间。 这可以通过以下方式完成:

int main() {
    clock_t start;
    clock_t end;
    double cpu_time_used;

    start = clock();
    # do some computations
    end = clock();

    cpu_time_used = ((double) (end-start)) / CLOCKS_PER_SEC;
}

它易于使用,您可以获得调用进程的CPU滴答,但精度以毫秒为单位。

如果需要更高的精度,POSIX函数clock_gettime()精度为纳秒级。您可以指定检索系统范围,每个进程或特定于线程的已用时间。这是一个例子:

int main() {    
    timespec start;
    timespec end;

    double cpu_time_used;

    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);
    # do some computations
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end);

    cpu_time_used = (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / 1000000000.0;
}

答案 4 :(得分:0)

如果你想测量时间并进一步想要更好地优化这些功能以配合像oprofile这样的分析工具那么你就会知道哪个功能需要花费多少时间。用'opannotate'你会更好地了解