65.9K
CodeProject 正在变化。 阅读更多。
Home

VC++的另一个分析器

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.71/5 (8投票s)

2006年11月26日

CPOL

3分钟阅读

viewsIcon

44863

downloadIcon

450

一个分析器,用于计算每个被分析函数的总执行时间和已逝执行时间。

引言

这是一个 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.cppprofile.h。 包含“profile.h”并将宏“PP”放在每个要进行性能分析的函数的开头。 在程序的末尾,调用 CProfiler::ExportProf()。 CSV 文件将被保存在应用程序目录下。 演示项目已注释,应该非常简单明了。 在演示项目中,类 CProfTest 中的函数将被进行性能分析。

这是我第一次在这里发表文章。我只希望我没有违反太多规则。欢迎任何批评和/或反馈。

更新于 2006 年 11 月 30 日

感谢 eTurtle 和 yarp 的帖子。

为了对多线程程序进行性能分析。 我添加了一个堆栈映射来跟踪每个单独线程的入口/出口时间。 所以上面提到的偏移量不会影响其他线程。 我添加了一个 CCriticalSection 来保护静态集合的操作。 我不确定这是否必要。 而且我不确定是否有一些我忽略了的情况。 但到目前为止,它似乎对我的简单多线程测试用例有效。 当然,这应该是一个“快速而粗糙”的技巧。 ;)

如果有什么问题,请告诉我。

同时修复了一些小错误,并添加了一些更多注释,稍微整理了一下代码。 请在准备好后下载更新的版本。

我为 CSV 添加了“区域设置”支持,并修复了 eTurtle 指出的日期格式。 我认为在我准备这篇文章和项目时,我能够保持清醒——在喝了半打啤酒之后...

再见。

© . All rights reserved.