总结一些常用的方法,思考如何分析一个程序的时间消耗。
总之,根据二八定律,程序运行过程中20%的代码消耗了80%的时间, 关键的问题是找出这20%代码,然后进行优化。不知道大家还有没有其他好的性能分析方法?
1. Trace Log
这个是大家最常用,也是最简单和有效地方法。通常是在函数的开始和结束的位置加入Log, 最后通过Log记录时间统计函数的时间消耗。
有时嫌2次log太麻烦,我们可以通过RAII进行封装:
class
CTimeCostDebug
{
public :
CTimeCostDebug(LPCTSTR lpszFunName);
~ CTimeCostDebug()
};
{
public :
CTimeCostDebug(LPCTSTR lpszFunName);
~ CTimeCostDebug()
};
我们在构造函数里记录
开始
时间,在析构函数里记录结束时间以及打印时间消耗。
只要这样用就好了:
int
main()
{
{
CTimeCostDebug t(_T( " test_fun " ));
test_fun();
}
return 0 ;
}
{
{
CTimeCostDebug t(_T( " test_fun " ));
test_fun();
}
return 0 ;
}
这里时间记录函数推荐用高精度的QueryPerformanceCounter (曾经尝试用GetTickCount,结果发现误差超过10ms).
2. WinDbg的!runaway命令
该命令可以打印每个线程的时间消耗:包括用户模式执行时间,内核模式执行时间以及线程创建到现在的总时间。
通过该命令我们可以分析出哪些线程在空转消耗时间,然后进行优化
![](https://i-blog.csdnimg.cn/blog_migrate/093d879823a1ee8488b2884b95053d1d.png)
3. WinDbg 的 wt 命令
该命令可以帮我们分析目标函数及其子程序执行的指令数,然后帮我们分析该函数的性能消耗分布。
比如我们分析ShowWindow API 的指令消耗, 我们可以看到内部子函数的调用及开销:
![](https://i-blog.csdnimg.cn/blog_migrate/668384acefdaddbd2ef34ab81ba08361.png)
![](https://i-blog.csdnimg.cn/blog_migrate/aeeeab6e6980960a27618f8643757151.png)
4. VS profiler
VS 2010之后自带性能分析工具Profiler, 该工具可以帮我们对程序运行的性能进行分析。
![](https://i-blog.csdnimg.cn/blog_migrate/5b2a78d66e73febc4d46b08e00a6fab6.png)
5. Intel VTune
我用的是
Intel VTune
Amplifier XE 2011, 这个工具非常专业,可以在VS2008里使用,帮我们分析程序的热点开销和关键调用。
![](https://i-blog.csdnimg.cn/blog_migrate/de67da002b267ce4263d332b101463c2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a22467e113fd47fc8bd16e7d8e457f06.png)
总之,根据二八定律,程序运行过程中20%的代码消耗了80%的时间, 关键的问题是找出这20%代码,然后进行优化。不知道大家还有没有其他好的性能分析方法?