VC++的另一个分析器
一个分析器,用于计算每个被分析函数的总执行时间和已逝执行时间。
引言
这是一个 Visual C++ 2003 的性能分析器。
我需要一个 C++ (Visual Studio 2003) 的性能分析器来检查我的某些项目中,瓶颈在哪里。不需要花哨的功能。 这个性能分析器应该非常容易使用。 并且它应该能够计算每个函数的执行时间,而不是/加上总的经过时间(稍后解释)。
另一方面,我不需要一个超高精度的计时器,并且性能分析代码带来的合理开销是可以接受的。我的原因是:我知道优化是“邪恶”的——嗯,也许是过度优化。所以我只想找出那些看起来无辜,但却占用了 30% 执行时间,并且可以轻松降低到 5% 的愚蠢函数。
我绝对不需要一个带 CListCtrl
的花哨的用户界面。 我更喜欢 CSV 输出,这样我就可以在 Excel 中查看和分析结果。
就是这样。
执行时间
函数的计时由 Hernán Di Pietro 的 CProfile - 一个简单的代码性能分析和跟踪类解释得很清楚。 我将在这里稍微谈一下如何记录函数的执行时间。考虑函数 Foo()
和 Bar()
。 Foo()
调用 Bar()
。 如果我在 Foo()
的入口点和出口点记录时间并计算持续时间,我将包括 Foo()
中 Bar()
的执行时间。 我想确切地知道 Foo()
做了什么,并且只做了什么。 所以,除了记录入口和出口时间外,我还有一个偏移量。 这个量被每个经过性能分析的函数调用减去。
我使用一个堆栈来找出每个函数调用的匹配入口和出口记录。 然后计算总的经过时间和执行时间(被函数调用中的持续时间所抵消)。 每个持续时间都放在一个 CMap
中,以函数名称作为键。 请注意,由于所有函数名称都由指令 __FUNCTION__
确定为常量字符串。 因此,不需要复制/删除 char 指针。
用法
只需在您的项目中添加 profile.cpp 和 profile.h。 包含“profile.h”并将宏“PP”放在每个要进行性能分析的函数的开头。 在程序的末尾,调用 CProfiler::ExportProf()
。 CSV 文件将被保存在应用程序目录下。 演示项目已注释,应该非常简单明了。 在演示项目中,类 CProfTest
中的函数将被进行性能分析。
这是我第一次在这里发表文章。我只希望我没有违反太多规则。欢迎任何批评和/或反馈。
更新于 2006 年 11 月 30 日
感谢 eTurtle 和 yarp 的帖子。
为了对多线程程序进行性能分析。 我添加了一个堆栈映射来跟踪每个单独线程的入口/出口时间。 所以上面提到的偏移量不会影响其他线程。 我添加了一个 CCriticalSection
来保护静态集合的操作。 我不确定这是否必要。 而且我不确定是否有一些我忽略了的情况。 但到目前为止,它似乎对我的简单多线程测试用例有效。 当然,这应该是一个“快速而粗糙”的技巧。 ;)
如果有什么问题,请告诉我。
同时修复了一些小错误,并添加了一些更多注释,稍微整理了一下代码。 请在准备好后下载更新的版本。
我为 CSV 添加了“区域设置”支持,并修复了 eTurtle 指出的日期格式。 我认为在我准备这篇文章和项目时,我能够保持清醒——在喝了半打啤酒之后...
再见。