这个项目有许多功能,其中一些需要花费大量的时间来执行。 现在我的任务是找到那些任务大部分时间的功能。
这是我的步骤:
编写宏来计算执行时间
#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.将宏放到所有函数
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;
}
运行
===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
这是我的问题:
我必须将CALCULATE_EXE_TIME和CET_BEFORE_RETURN手动放入所有功能!这是一项巨大的工作! 有没有办法自动执行?
我曾想过将CET_BEFORE_RETURN放到析构函数中,以便在函数返回后调用它。但是gcc不支持类析构函数。
答案 0 :(得分:0)
我建议使用配置文件工具,如VTune for VS或Instruments for Xcode,这样您就不需要添加丑陋的代码来计算执行时间,这也会降低执行速度并使结果不准确。分析工具提供了更多信息,例如定位性能瓶颈。