如何分析程序的时间消耗

总结一些常用的方法,思考如何分析一个程序的时间消耗。

1.  Trace Log

这个是大家最常用,也是最简单和有效地方法。通常是在函数的开始和结束的位置加入Log, 最后通过Log记录时间统计函数的时间消耗。

有时嫌2次log太麻烦,我们可以通过RAII进行封装:

class CTimeCostDebug
{
public:
 CTimeCostDebug(LPCTSTR lpszFunName);
 ~CTimeCostDebug()
};

我们在构造函数里记录开始时间,在析构函数里记录结束时间以及打印时间消耗。

只要这样用就好了:

int main()
{
    {
        CTimeCostDebug t(_T("test_fun"));
        test_fun();
    }

return 0;
}

这里时间记录函数推荐用高精度的QueryPerformanceCounter (曾经尝试用GetTickCount,结果发现误差超过10ms).

2. WinDbg的!runaway命令

该命令可以打印每个线程的时间消耗:包括用户模式执行时间,内核模式执行时间以及线程创建到现在的总时间。

通过该命令我们可以分析出哪些线程在空转消耗时间,然后进行优化

3. WinDbg 的 wt 命令

该命令可以帮我们分析目标函数及其子程序执行的指令数,然后帮我们分析该函数的性能消耗分布。

比如我们分析ShowWindow API 的指令消耗, 我们可以看到内部子函数的调用及开销:

4. VS  profiler

VS  2010之后自带性能分析工具Profiler, 该工具可以帮我们对程序运行的性能进行分析。

5.  Intel VTune

我用的是  Intel VTune Amplifier XE 2011, 这个工具非常专业,可以在VS2008里使用,帮我们分析程序的热点开销和关键调用。


总之,根据二八定律,程序运行过程中20%的代码消耗了80%的时间, 关键的问题是找出这20%代码,然后进行优化。不知道大家还有没有其他好的性能分析方法?

还可以用xperf

http://www.cppblog.com/weiym/archive/2014/09/16/208335.html

时间: 2024-10-23 02:23:35

如何分析程序的时间消耗的相关文章

从阅读Discuz的核心代码并给出注释的经历分析程序员该如何阅读代码?

本文标签:   程序员 php Discuz的核心代码 框架 深度学习框架 阅读优秀的代码,是技术水平成长的最佳途径.记得每个进来的新人,我都做过阅读优秀代码的要求,但几乎都只能坚持很少一段时间而已. 前晚大家还在开玩笑的讨论,都是因为看了前人的一些写法,才学会了一些乱七八糟的花招. 晚上我又开始重新阅读Discuz的核心代码,花了1h多的时间,才完成一个core文件的注释. 注释后的代码: <?php /** * [Discuz!] (C)2001-2099 Comsenz Inc. * Th

JavaScript 的时间消耗--摘抄

JavaScript 的时间消耗 2017-12-24 dwqs 前端那些事儿 随着我们的网站越来越依赖 JavaScript, 我们有时会(无意)用一些不易追踪的方式来传输一些(耗时的)东西. 在这篇文章中, 我会介绍一些能让你的网站在移动设备上快速加载且可交互的方式. 摘要: 更少的代码 = 更少的解析/编译(时间) + 更少的传输(时间) + 更少的解压(时间) 网络 大多数开发者考虑 JavaScript 的时间消耗时, 都会首先考虑到 JavaScript 的下载和执行消耗. 脚本传输

递归下降分析程序

一.      实验目的 编制一个递归下降分析程序 LL(1)文法: E->TE1 E1->+TE1|-TE1|∑ T->FT1; T1->*FT1|/FT1|∑ F->(E)|i|1 二.      实验内容和要求 输入:LL(1)文法 判断:每遇到一个终结符,则判断当前读入的单词符号是否与该终结符相匹配,若匹配,则继续读取下一个单词符号,若不匹配,则进行错误处理. 每遇到一个非终结符,则调用相应的分析子程序 一.      实验方法.步骤及结果测试   1.   源程序名

词法与文法分析程序

1.词法与文法分析程序功能:   主要语句:begin<语句串>end 输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“成功”,否则输出“错误”. 2.符号与种别码对照表: 单词符号 种别码 单词符号 种别码 begin 1 : 17 if 2 := 18 then 3 < 20 while 4 <= 21 do 5 <> 22 end 6 > 23 l(l|d)* 10 >= 24 dd* 11 = 25 + 13 ; 26 - 14

递归下降分析程序报告

实验一.递归下降分析程序实验 专业 商业软件工程   姓名 姓名 学号 201506110148 一.        实验目的   编译递归下降分析程序识别c语言文法 二.        实验内容和要求 简单写出c语言文法 分析c语言文法是否为LL1文法,若不是,修改成LL1文法. 编写程序实现对c语言LL1文法判断是否有语法错误 三.        实验方法.步骤及结果测试  1.      源程序名:递归下降分析程序 源程序名递归下降分析程序.c 可执行程序名:递归下降分析程序.exe 2.

实验三、&#160;递归下降分析程序实验

实验三. 递归下降分析程序实验 专业 软件工程   姓名 麦振澎 学号 201506110162 一.        实验目的           通过设计,编制,调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构的分析. 二.        实验内容和要求 输入:源程序字符串 输出:正确或者错误 三.        实验方法.步骤及结果测试             1.      源程序名: 递归下降语法分析程序.c       2.      原理分析及流程图

google perftools分析程序性能

Google perftools 1.功能简介 它的主要功能就是通过采样的方式,给程序中cpu的使用情况进行“画像”,通过它所输出的结果,我们可以对程序中各个函数(得到函数之间的调用关系)耗时情况一目了然.在对程序做性能优化的时候,这个是很重要的,先把最耗时的若干个操作优化好,程序的整体性能提升应该十分明显,这也是做性能优化的一个最为基本的原则—先优化最耗时的. 2.安装 1.下载gperftools Wget https://code.google.com/p/gperftools/downl

实验三 递归下降分析程序实验

一.        实验目的      编制一个递归下降分析程序. 二.        实验内容和要求 输入:正规式 输出:判断该正规式是否正确. 三.        实验方法.步骤及结果测试    1.    源程序名:递归下降分析程序.c 可执行程序名:递归下降分析程序.exe   2. 3.主要程序段及其解释: #include<stdio.h> #include<string> char str[50]; int index=0; void E(); //E->TX;

个人分析程序员的性格特点,生活习惯

 身为程序员的您是否有下面这么多性格与习惯? 1.聪明但是给人的感觉是不谦逊. 2.交流与合作能力比较强,但是又往往向往个人主义! 3.懒惰,大部分程序员可能都是这样,也许是因为程序员已经习惯了脑力劳动. 4.创造力非常强,但是好像又缺乏纪律性! 5.学习能力非常强,但是又往往太过于依赖个人经验. 从我个人就暂时归纳这么多,请大家继续跟帖总结... 个人分析程序员的性格特点,生活习惯