我在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多个电话!为了确保它不是一些缓存的探查器数据或损坏的函数查找表,我正在每次测试之间进行清理和重建。结果仍然相同!
有什么想法吗?
答案 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%以上。