VC6 Profiler问题:伪函数调用

时间:2010-07-02 18:00:19

标签: profiler vc6

我在VC6下分析应用程序时遇到了以下问题。当我分析应用程序时,分析器指示类似于以下的简单getter方法被调用了数十万次:

int SomeClass::getId() const
{
   return m_iId;
};

问题是,此方法不会在测试应用中的任何位置调用。当我将代码更改为以下内容时:

int SomeClass::getId() const
{
   std::cout << "Is this method REALLY being called?" << std::endl;
   return m_iId;
};

探查器从不在调用函数列表中包含getId。评论cout,我回到我开始的地方,有130多个电话!为了确保它不是一些缓存的探查器数据或损坏的函数查找表,我正在每次测试之间进行清理和重建。结果仍然相同!

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

我猜测正在发生的事情是编译器和/或链接器将这个非常简单的函数“合并”到一个或多个相同的其他函数(为return m_iId生成的代码可能就是与碰巧返回同一偏移的成员的许多其他getter一样。

实质上,碰巧具有相同机器代码实现的一堆不同函数都被解析为相同的地址,使分析器混乱。

您可以通过关闭优化来阻止这种情况发生(如果这是问题)。

答案 1 :(得分:0)

我假设您正在分析,因为您想知道是否有办法让程序花费更少的时间,对吧?你不只是简介,因为你喜欢看数字。

有一种简单,老式,经过验证的方法可以找到性能问题。程序运行时,只需点击“暂停”按钮,然后查看调用堆栈。这样做几次,比如5到20次。问题越严重,您需要找到的样本越少。

有些人会问,这是不是基本上不是分析者所做的,答案很少。 Most profilers fall for one or more common myths,结果是你的加速是有限的,因为他们找不到所有问题:

  • 有些节目在“热点”中花费了不必要的时间。在这种情况下,您将看到堆栈“末尾”(程序计数器所在的位置)的代码正在进行不必要的工作。

  • 某些程序执行的I / O超出了必要的范围。如果是这样,您将看到他们正在进行I / O.

  • 大型节目通常很慢,因为他们的呼叫树不必要地浓密,需要修剪。如果是这样,您将在堆栈中看到不必要的函数调用。

您在某些百分比的堆栈上看到的任何代码,如果删除,将保存执行时间的百分比(或多或少)。你不能出错。经过多次迭代,Here's an example节省了97%以上。