首页 > 解决方案 > 如何优雅地为 C 代码的多个部分计时,而又不至于如此冗长?

问题描述

timing==1只有当标志和我希望不同的时间进入不同的变量时,我才会对 C 代码的许多不同部分进行计时。

这就是我目前正在做的事情:

if (timing) {time1=getTime}
foo(A);
bar(A);
if (timing) {elapsed1+=getTime-time1;}

if (timing) {time2=getTime}
bar(A);
if (timing) {elapsed2+=getTime-time2;

if (timing) {time2=getTime}
bar(C);
if (timing) {elapsed2+=getTime-time2;

if (timing) {time1=getTime}
foo(A);
fun(B);
if (timing) {elapsed1+=getTime-time1;}

然而,这是漫长而丑陋的。有没有更好的方法来代替做一些更短、更优雅的事情?例如,它可能是:

time1+=TIMEIT{
foo(A);
bar(A);
}

time2+=TIMEIT{
bar(A);
}

time2+=TIMEIT{
bar(B);
}

time1+=TIMEIT{
foo(A);
fun(B);
}

0如果timing==0或其他情况下,timeit 返回{}.

此外,有没有一种方法可以自动计算出一个代码块(或整个代码)花费了多少时间来调用,比如说,调用 bar() 和 foo() - 但不分析 fun() 和 swiz()整个代码?如果是这样,这会降低性能吗?

更具体地说,它将类似于:

time+=TIMECALLSTOBARANDFOO{
foo(A);
bar(B);
swiz(foo(A));
...
fun(A);
bar(C);
...
}

wheretimebar将仅包含调用所花费的时间barfoo但不包含那里的其余内容。

我在 Linux 上通过 mex 使用 gcc。

标签: c

解决方案


您可以使用宏根据变量“timing”中的值调用时序逻辑

#include <stdio.h>

int elapsed1 = 0, time1 = 0;
int timing = -1;

#define TIMEIT(x) \
if (timing) {\
time1=getTime();} \
x;\
if (timing) {elapsed1+=getTime()-time1;}


void a(void);
int getTime();

int main()
{
    printf("Hello, World!\n");

    timing = -1;
    TIMEIT(a());

    timing = 0;
    TIMEIT(a());

    return 0;
}
void a(void) {printf("\n Hello from a()");}
int getTime() {printf("\n Hello from getTime()"); return 42;}

推荐阅读