我希望不是每个人都在使用 Rational Purify。
那么当你想测量时你会怎么做:
- 函数花费的时间
- 内存使用峰值
- 代码覆盖率
目前,我们手动进行[使用带有时间戳的日志语句和另一个脚本来解析日志并输出到 excel。呼……)
你会推荐什么?指向工具或任何技术将不胜感激!
编辑:对不起,我没有先指定环境,它是专有移动平台上的纯 C
我已经做了很多。如果您有 IDE 或 ICE,则有一种技术需要一些手动操作,但不会失败。
警告:现代程序员讨厌这个,我会被否决。他们喜欢他们的工具。但它确实有效,而且您并不总是拥有好的工具。
我假设在您的情况下,代码类似于在计时器上运行的 DSP 或视频,并且必须快速。假设您在每个计时器滴答声中运行的是子程序 A。编写一些测试代码以在一个简单的循环中运行子程序 A,例如 1000 次,或者足够长的时间让您至少等待几秒钟。
在它运行时,用暂停键随机停止它并采样调用堆栈(不仅仅是程序计数器)并记录它。(这是手动部分。)这样做几次,比如 10 次。一次是不够的。
现在寻找堆栈样本之间的共性。寻找至少出现在 2 个样本上的任何指令或调用指令。其中会有很多,但其中一些将在您可以优化的代码中。
这样做,你会得到很好的加速,保证。1000 次迭代将花费更少的时间。
您不需要大量样品的原因是您不是在寻找小东西。就像您在 10 个样本中的 5 个上看到特定的调用指令一样,它大约占总执行时间的 50%。如果您真的想知道,更多样本会更准确地告诉您百分比是多少。如果你像我一样,你只想知道它在哪里,所以你可以修复它,然后继续下一个。
这样做直到你找不到更多可以优化的东西,你将达到或接近你的最高速度。
您可能需要不同的工具来进行性能分析和代码覆盖。
对于分析,我更喜欢 MacOSX 上的 Shark。它是免费的,而且非常好。如果您的应用程序是 vanilla C,您应该可以使用它,如果您可以使用 Mac。
对于 Windows 上的分析,您可以使用 LTProf。便宜,但不是很好: http ://successfulsoftware.net/2007/12/18/optimising-your-application/
(我认为微软没有为更便宜的 Visual Studio 版本提供一个像样的分析器,这真的是在自取其辱。)
对于覆盖率,我更喜欢 Windows 上的 Coverage Validator: http: //successfulsoftware.net/2008/03/10/coverage-validator/ 它实时更新覆盖率。
对于复杂的应用程序,我是英特尔Vtune的忠实粉丝。它与检测代码的传统分析器略有不同。它通过对处理器进行采样以查看指令指针每秒 1,000 次的位置来工作。它具有不需要对二进制文件进行任何更改的巨大优势,这通常不会改变您尝试测量的时间。
不幸的是,这对 .net 或 java 没有好处,因为 Vtune 无法像传统代码那样将指令指针映射到符号。
它还允许您测量各种其他以处理器/硬件为中心的指标,例如每条指令的时钟、高速缓存命中/未命中、TLB 命中/未命中等,这让您可以确定为什么某些代码部分的运行时间可能比您想的要长只需检查代码即可。
如果你正在做一个“on the metal”嵌入式“C”系统(我不太确定你的帖子中暗示了什么“移动”),那么你通常有某种计时器 ISR,其中很容易采样发生中断的代码地址(通过回溯堆栈或查看链接寄存器或其他方式)。然后以某种粒度/感兴趣范围的组合构建地址直方图是微不足道的。
然后通常不难编造一些代码/脚本/Excel 表的组合,将直方图计数与链接器符号/列表文件中的地址合并,为您提供配置文件信息。
如果您的 RAM 非常有限,收集足够的数据以使其既简单又有用可能会有点痛苦,但您需要告诉我们更多关于您的平台的信息。
nProf - 免费,适用于 .NET。
完成工作,至少足以看到 80/20。(20% 的代码,占用 80% 的时间)
Google Perftools在这方面非常有用。
我在 MSVC 6 和 XP 中使用devpartner
如果您的平台是专有操作系统,那么任何工具将如何工作?我认为你现在正在尽你所能