计算所有功能的执行时间

时间:2015-04-01 12:37:50

标签: c performance time

这个项目有许多功能,其中一些需要花费大量的时间来执行。 现在我的任务是找到那些任务大部分时间的功能。

这是我的步骤:

  1. 编写宏来计算执行时间

    #ifndef _CALCULATE_EXE_TIME_
    #define _CALCULATE_EXE_TIME_
    
    #include <time.h>
    #include <stdio.h>
    
    #define CALCULATE_EXE_TIME static clock_t CET_start_time, CET_end_time; \
    static float CET_expend_time, CET_total_expend_time;            \
    static unsigned int CET_invoked_times = 0;                      \
    CET_start_time = clock();                                       \
    
    #define CET_BEFORE_RETURN CET_end_time = clock(); \
    CET_expend_time = (float)(CET_end_time - CET_start_time) / CLOCKS_PER_SEC; \
    CET_total_expend_time += CET_expend_time;                       \
    printf("===%s:%s()  invoked_times=%u  expend_time=%.4fs  total_expend_time=%.4fs\n", \
           __FILE__, __FUNCTION__, ++CET_invoked_times, CET_expend_time, CET_total_expend_time);
    
    #endif  // _CALCULATE_EXE_TIME_
    
  2. 2.将宏放到所有函数

    static void john_register_one(struct fmt_main *format)
    {
        CALCULATE_EXE_TIME
    
        // Do something   
    
        CET_BEFORE_RETURN
    }
    
    many other functions
    many other functions
    
    static char *john_loaded_counts(void)
    {
        CALCULATE_EXE_TIME
    
        static char s_loaded_counts[80];
    
        if (database.password_count == 1) {
            CET_BEFORE_RETURN return "1 password hash";
        }
    
        CET_BEFORE_RETURN return s_loaded_counts;
    }
    
    1. 运行

      ===wordlist.c:mgetl()  invoked_times=1893  expend_time=0.0000s  total_expend_time=0.0082s
      ===cracker.c:crk_process_key()  invoked_times=1880  expend_time=0.0000s  total_expend_time=0.0097s
      ===cracker.c:crk_process_event()  invoked_times=10  expend_time=0.0000s  total_expend_time=0.0011s
      ===cracker.c:crk_password_loop()  invoked_times=235  expend_time=0.0000s  total_expend_time=208.5752s
      ===cracker.c:crk_salt_loop()  invoked_times=235  expend_time=0.0000s  total_expend_time=208.6260s
      ===cracker.c:crk_done()  invoked_times=1  expend_time=0.0000s  total_expend_time=0.0000s
      ===wordlist.c:get_progress()  invoked_times=2  expend_time=0.0000s  total_expend_time=0.0000s
      ===wordlist.c:save_state()  invoked_times=2  expend_time=0.0000s  total_expend_time=0.0000s
      ===wordlist.c:do_wordlist_crack()  invoked_times=1  expend_time=208.9100s  total_expend_time=208.9100s
      ===batch.c:do_wordlist_pass()  invoked_times=1  expend_time=208.9100s  total_expend_time=208.9100s
      ===batch.c:do_batch_crack()  invoked_times=1  expend_time=208.9109s  total_expend_time=208.9109s
      ===wordlist.c:get_progress()  invoked_times=3  expend_time=0.0000s  total_expend_time=0.0000s
      ===cracker.c:crk_get_key2()  invoked_times=1  expend_time=0.0000s  total_expend_time=0.0000s
      
    2. 这是我的问题

      我必须将CALCULATE_EXE_TIME和CET_BEFORE_RETURN手动放入所有功能!这是一项巨大的工作! 有没有办法自动执行

      我曾想过将CET_BEFORE_RETURN放到析构函数中,以便在函数返回后调用它。但是gcc不支持类析构函数。

1 个答案:

答案 0 :(得分:0)

我建议使用配置文件工具,如VTune for VS或Instruments for Xcode,这样您就不需要添加丑陋的代码来计算执行时间,这也会降低执行速度并使结果不准确。分析工具提供了更多信息,例如定位性能瓶颈。