c - 如何优雅地为 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
将仅包含调用所花费的时间bar
,foo
但不包含那里的其余内容。
我在 Linux 上通过 mex 使用 gcc。
解决方案
您可以使用宏根据变量“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;}
推荐阅读
- java - 房间数据库 DAO 查询到带有 int 值的 SUM() 列并返回它...使用 MVM 模型
- jmeter - Jmeter 为 SQL 查询返回“语句未返回结果集”
- spring-cloud-config - 带有 JDBC 的 Spring config server 抛出 Invalid config server configuration 错误
- python - Keras 神经网络准确率仅为 10%
- unity3d - 在 Unity 3D 中移动游戏对象的最佳方式
- javascript - 当 React 中的状态发生变化时,HighCharts 不会更新
- javascript - Rails 应用程序导致 javascript 中断
- java - 如何解析变量在内部类中被访问,需要声明为final
- python - 读取 .arff 文件并尝试忽略标题
- reactjs - 如何修复 WebApp 保持渲染状态?