2008-11-12 94 views

回答

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()); 
+0

我喜欢这样。可以将其定义为x;正常运行。 – EvilTeach 2008-11-13 00:50:14

+0

是的,我这样做,但我忘了把它添加到我的答案。感谢您的提醒。 – 2008-11-13 14:38:50

3

从本质上讲,如果剖析工具不可用,那么您就可以模拟剖析器将会完成的工作。您可以将计数器插入到您认为有趣的函数中,并计算多少次,并计算它们被调用的大小/种类的参数。

如果你有机会到你的平台上的所有计时器,您就可以开始/之初/结束阻止这些说函数来获取执行时间信息为好,如果这是从代码不清楚。这将给你在复杂代码中最大的压力,因为通常会有太多的函数来测试它们。相反,您可以通过为每个代码分配一个计时器来获取代码的某些部分所花费的时间。

这两种串联技术可以形成一种迭代方法,您可以在其中找到大量使用定时器消耗大部分循环的代码,然后以更精细的粒度对各个函数进行处理以磨练问题。

2

如果是东西足够长的持续时间(例如一分钟以上),我运行该软件在调试器则打破了几次,看看那里的调试器中断,这给软件就是一个非常粗略的想法直到(例如,如果你打破10次,他们都在同一个地方,这告诉你一些有趣的事情!)。 非常粗糙,准备好,但不需要任何工具,仪器仪表等

8

不开玩笑:除倾销定时到std ::法院和面向方法我也用了蜂鸣()函数其他文本/数据。听到两个“哔哔”检查站之间的沉默间隙有些东西可以让人产生不同的印象。

这就像看一个书面乐谱,居然听到了音乐的区别。这就像读取rgb(255,0,0)和看到消防车红色之间的差异。

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

+1

真是个好主意。 – 2008-11-13 00:44:06

1

我会使用80/20法则,把周围的热点或有趣的调用路径定时器。您应该对瓶颈(或至少大部分执行路径)的位置有一个总体思路,并使用适当的平台相关高分辨率定时器(QueryPerformanceCounters,gettimeofday等)。

我通常不与任何在启动或关机(除非需要),并具有明确定义的“咽喉要道”,通常是消息传递或某种算法计算的麻烦。我通常发现消息接收器/ srcs(sinks moreso),队列,互斥锁和简单的混乱(算法,循环)通常会占据执行路径中的大部分延迟。

2

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

1

您是否使用Visual Studio?

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

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

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

相关问题