c - 你如何分析你的代码?

标签 c profiling

我希望不是每个人都在使用 Rational Purify。

那么当你想测量时你会做什么:

  • 一个函数花费的时间
  • 内存使用峰值
  • 代码覆盖率

目前,我们手动完成[使用带有时间戳的日志语句和另一个脚本来解析日志并输出到 excel。呸……)

你会推荐什么?指出工具或任何技术将不胜感激!

编辑:抱歉,我没有首先指定环境,它是专有移动平台上的纯 C

最佳答案

我已经做了很多。如果您有 IDE 或 ICE,there is a technique这需要一些手动操作,但不会失败。

警告:现代程序员讨厌这个,我会被否决。他们喜欢他们的工具。但它确实有效,而且您并不总是拥有好的工具。

我假设在您的情况下,代码类似于在计时器上运行的 DSP 或视频,并且必须很快。假设您在每个计时器刻度上运行的是子例程 A。编写一些测试代码以在一个简单的循环中运行子例程 A,比如说 1000 次,或者足够长的时间让您至少等待几秒钟。

在它运行时,用暂停键随机停止它并对调用堆栈(不仅仅是程序计数器)进行采样并记录下来。 (这是手动部分。)重复几次,例如 10 次。一次是不够的。

现在寻找堆栈样本之间的共性。查找出现在至少 2 个样本上的任何指令或调用指令。会有很多这样的内容,但其中一些将包含在您可以优化的代码中。

这样做,你会得到一个很好的加速,保证。 1000 次迭代将花费更少的时间。

您不需要大量样本的原因是您不是在寻找小东西。就像您在 10 个样本中的 5 个样本中看到一条特定的调用指令,它大约占总执行时间的 50%。如果你真的想知道的话,更多的样本会更准确地告诉你百分比是多少。如果您像我一样,只想知道它在哪里,这样您就可以修复它,然后继续下一个。

一直这样做,直到您找不到更多需要优化的东西,您将达到或接近您的最高速度。

关于c - 你如何分析你的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56672/

相关文章:

c - 将多维数组中的值写入 .csv 文件

c++ - 在两个值之间插入一个值

c - 使用 valgrind 了解每个函数花费的时间(以秒为单位)

c - 为什么静态全局变量可以在其他文件中访问?

c - 在按Ctrl + D后停止用户输入需要按2次。为什么?

mysql - 减少 DBI::common::Fetch 的调用 (Perl)

c++ - 在 C++ 中逐行分析

java - visualvm 对比 JProbe 对比 JProfiler

performance - 为什么在每个 clEnqueue 函数中都会调用 clGetPlatformInfo?

c - 导入表IAT中的打印功能,C/C++语言