V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ly90907
V2EX  ›  问与答

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

  •  
  •   ly90907 · 2021-02-26 15:22:39 +08:00 · 1258 次点击
    这是一个创建于 1400 天前的主题,其中的信息可能已经有所发展或是发生改变。
    例如我有这么一段代码:

    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())

    请问各位大佬我该怎么写?十分感谢
    11 条回复    2021-02-26 19:53:51 +08:00
    senghoo
        1
    senghoo  
       2021-02-26 15:56:07 +08:00   ❤️ 2
    ly90907
        2
    ly90907  
    OP
       2021-02-26 16:10:54 +08:00
    @senghoo 惊了,完全符合我的想法,我就是卡在了#f 这里,十分感谢大佬!!
    ly90907
        3
    ly90907  
    OP
       2021-02-26 16:19:16 +08:00
    @senghoo 另外我还有个疑问,如果我只想打印 f 名字,而不打印 f()里的参数,有没有办法实现呢?
    senghoo
        4
    senghoo  
       2021-02-26 16:27:44 +08:00
    @ly90907 其实 C/C++的预处理就是字符串替换。如果有需要完全可以把#f 当作一个字符串,用常规的字符串处理函数把后面部分去掉再显示。
    wamson
        5
    wamson  
       2021-02-26 16:33:23 +08:00 via iPhone
    @ly90907 cout << __FUNCTION__;
    wamson
        6
    wamson  
       2021-02-26 16:34:53 +08:00 via iPhone
    @ly90907 搞混了,宏的话,好像 8 行
    across
        7
    across  
       2021-02-26 16:36:20 +08:00   ❤️ 1
    @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
        8
    ly90907  
    OP
       2021-02-26 16:53:29 +08:00
    @senghoo 了解,已经试验成功,十分感谢大佬解惑
    ly90907
        9
    ly90907  
    OP
       2021-02-26 17:02:40 +08:00
    @across 您这个应该也可以,但是用的时候似乎需要把函数名和参数分开写,不然编译会报错,不过依然感谢
    ly90907
        10
    ly90907  
    OP
       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
        11
    byaiu  
       2021-02-26 19:53:51 +08:00 via iPhone
    这不是很多库都有的东西么……现在大众 cpp 的水平都这样了?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2714 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 05:50 · PVG 13:50 · LAX 21:50 · JFK 00:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.