您可以使用哪些技术来分析代码

时间:2008-11-12 22:58:45

标签: c++ profile profiler homebrew

我开发的一些平台没有分析工具。我正在寻找您亲自用来帮助您识别热点的建议/技巧,而无需使用分析器。

目标语言是C ++。

我对你个人使用的内容感兴趣。

7 个答案:

答案 0 :(得分:8)

不开玩笑:除了将时序转储到std :: cout和其他面向文本/数据的方法之外,我还使用了Beep()函数。听到两个“哔”检查点之间的沉默差异会产生不同的印象。

这就像看书面乐谱和实际聆听音乐之间的区别。这就像读取rgb(255,0,0)和看到消防车红色之间的区别。

所以,现在,我有一个客户端/服务器应用程序和不同频率的蜂鸣声,标记客户端发送消息的位置,服务器开始其回复,完成其回复,回复首先进入客户端等,我很自然地能够感受到时间花在哪里。

答案 1 :(得分:5)

我发现以下内容非常有用:

#ifdef PROFILING
# define PROFILE_CALL(x) do{ \
    const DWORD t1 = timeGetTime(); \
    x; \
    const DWORD t2 = timeGetTime(); \
    std::cout << "Call to '" << #x << "' took " << (t2 - t1) << " ms.\n"; \
  }while(false)
#else
# define PROFILE_CALL(x) x
#endif

这可以在调用函数中使用:

PROFILE_CALL(renderSlow(world));
int r = 0;
PROFILE_CALL(r = readPacketSize());

答案 2 :(得分:3)

实质上,如果没有可用的分析工具,则可以模拟分析器的功能。您可以将计数器插入到您认为有趣的函数中,并计算它们被调用的次数,并且可能会调用它们的大小/种类。

如果您可以访问平台上的任何计时器,您可以在所述函数的开头/结尾处启动/停止这些计时器以获取执行时间信息,如果代码中不清楚的话。在复杂的代码中,这将为您带来最大的收益,因为通常会有太多的功能来检测它们。相反,您可以通过为每个代码段专门设置一个定时器来获取所花费的时间。

这两种技术串联起来可以形成一种迭代方法,在这种方法中,您可以找到使用定时器消耗大部分周期的广泛代码,然后以更精细的粒度检测单个函数以磨练问题。

答案 3 :(得分:2)

如果持续时间足够长(例如一分钟或更长时间),我会在调试器中运行软件然后中断几次并查看调试器中断的位置,这可以非常粗略地了解软件的功能。 (例如,如果你打破了10次并且他们都在同一个地方,这会告诉你一些有趣的东西!)。 非常粗糙,准备好但不需要任何工具,仪器等。

答案 4 :(得分:2)

我不确定您的平台是什么,但在嵌入式微控制器上,有时使用示波器,计数器/定时器或逻辑分析仪旋转备用数字输出线并测量脉冲宽度是有帮助的。

答案 5 :(得分:1)

我会使用80/20规则并将计时器放在热点或有趣的呼叫路径周围。您应该大致了解瓶颈所在的位置(或者至少是大多数执行路径)并使用适当的平台相关高分辨率计时器(QueryPerformanceCounters,gettimeofday等)。

我通常不会在启动或关机时打扰任何东西(除非需要),并且会有明确定义的“阻塞点”,通常是消息传递或某种算法计算。我一般发现消息接收器/ srcs(接收更多),队列,互斥体,以及简单的混乱(算法,循环)通常占执行路径中大部分延迟。

答案 6 :(得分:1)

您使用的是Visual Studio吗?

您可以使用/ Gh和/ GH开关。 Here's an example involving stack inspection

这些标志允许您逐个文件地注册每次在运行时输入和/或保留方法时调用的未修饰函数。

然后,您可以注册所有时间分析信息,而不仅仅是时间信息。堆栈转储,调用地址,返回地址等。这很重要,因为您可能想要知道“函数X在函数Z下使用Y时间”而不仅仅是在函数X中花费的总时间。