我在 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 多个电话!为了确保它不是某些缓存的分析器数据或损坏的函数查找表,我在每次测试之间进行清理和重建。结果还是一样!

有任何想法吗?

有帮助吗?

解决方案

我猜想正在发生的事情是编译器和/或链接器正在“合并”这个非常简单的功能到一个或多个其他函数相同的功能(代码生成的代码 return m_iId 可能与许多其他返回相同偏移的成员的其他收益机完全相同。

从本质上讲,恰好具有相同机器代码实现的一系列不同功能都可以解决到相同的地址,从而使Profiler感到困惑。

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

其他提示

我假设您正在进行分析,因为您想了解是否有方法可以使程序花费更少的时间,对吧?您进行分析不仅仅是因为您喜欢查看数字。

有一种简单、老式、行之有效的方法来查找性能问题。当程序运行时,只需点击“暂停”按钮并查看调用堆栈。这样做几次,比如 5 到 20 次。问题越大,找到它所需的样本就越少。

有人问这是否基本上不是分析器所做的事情,答案是很少。 大多数分析者都会陷入一个或多个常见的误区, ,结果是你的加速受到限制,因为他们没有发现所有问题:

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

  • 有些程序执行的 I/O 数量超出了必要的数量。如果是这样,您将看到它们正在执行该 I/O。

  • 大型程序通常很慢​​,因为它们的调用树不必要地茂密,并且需要修剪。如果是这样,您将在堆栈中间看到不必要的函数调用。

您在一定百分比的堆栈上看到的任何代码如果被删除,都将节省该百分比的执行时间(或多或少)。你不会出错的。 这是一个例子, 经过多次迭代,节省了 97% 以上。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top