请问 c++如何写一个宏,来打印函数的名字和运行的时间?

2021-02-26 15:22:39 +08:00
 ly90907
例如我有这么一段代码:

time_t start = clock();
function_a();
cout << "function_a (<-这里随着函数的名字自适应) running time is " <<(double)(clock()-start)/CLOCKS_PER_SEC<<" s"<<endl;

我想把它写成一个宏的形式,比如:PRINT_FUN_TIME(val), 这样我想打印任何函数的运行时间就可以写成
PRINT_FUN_TIME(function_a())

请问各位大佬我该怎么写?十分感谢
1136 次点击
所在节点    问与答
11 条回复
senghoo
2021-02-26 15:56:07 +08:00
ly90907
2021-02-26 16:10:54 +08:00
@senghoo 惊了,完全符合我的想法,我就是卡在了#f 这里,十分感谢大佬!!
ly90907
2021-02-26 16:19:16 +08:00
@senghoo 另外我还有个疑问,如果我只想打印 f 名字,而不打印 f()里的参数,有没有办法实现呢?
senghoo
2021-02-26 16:27:44 +08:00
@ly90907 其实 C/C++的预处理就是字符串替换。如果有需要完全可以把#f 当作一个字符串,用常规的字符串处理函数把后面部分去掉再显示。
wamson
2021-02-26 16:33:23 +08:00
@ly90907 cout << __FUNCTION__;
wamson
2021-02-26 16:34:53 +08:00
@ly90907 搞混了,宏的话,好像 8 行
across
2021-02-26 16:36:20 +08:00
@ly90907


#define T(f,...) do { \
time_t start = clock(); \
f(__VA_ARGS__); \
cout << #f << " running time is " <<float(clock()-start)/CLOCKS_PER_SEC<<" s"<<endl; \
}while (0)



T(function_a,10);
ly90907
2021-02-26 16:53:29 +08:00
@senghoo 了解,已经试验成功,十分感谢大佬解惑
ly90907
2021-02-26 17:02:40 +08:00
@across 您这个应该也可以,但是用的时候似乎需要把函数名和参数分开写,不然编译会报错,不过依然感谢
ly90907
2021-02-26 17:04:28 +08:00
最终以如下方式实现
#define PRINT_FUNCTION_TIME(f) do { \
time_t start = clock(); \
f; \
std::string output = #f; \
cout << output.substr(0, output.find_first_of("(")) + " time = " <<float(clock()-start)/CLOCKS_PER_SEC<<" s"<<endl; \
}while (0)

PRINT_FUNCTION_TIME(test());
PRINT_FUNCTION_TIME(test2(a,b,c));
byaiu
2021-02-26 19:53:51 +08:00
这不是很多库都有的东西么……现在大众 cpp 的水平都这样了?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/756516

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX