在分析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+千次电话!为了确保不是缓存的分析器数据或损坏的函数查找表,我正在每个测试之间进行清理和重建。结果还是一样的!
有什么想法吗?
发布于 2010-07-02 18:03:49
我猜想,所发生的事情是编译器和/或链接器将这个非常简单的函数“合并”到一个或多个相同的其他函数(为return m_iId生成的代码可能与返回位于相同偏移量的成员的其他getter完全相同)。
本质上,一组碰巧具有相同的机器代码实现的不同函数都被解析到相同的地址,从而混淆了分析器。
您可以通过关闭优化来阻止这种情况发生(如果这是问题所在)。
发布于 2010-07-02 21:21:24
我认为您是在分析,因为您想知道是否有办法使程序花费更少的时间,对吗?你不只是因为你喜欢看数字而进行侧写。
有一个简单的,老式的,尝试和真实的方法来发现性能问题。当程序运行时,只需点击“暂停”按钮并查看调用堆栈。做几次,比如从5次到20次。问题越大,你需要找到的样本就越少。
有些人会问,这是否基本上不是分析器所做的,而答案却很少。Most profilers fall for one or more common myths,其结果是您的加速速度有限,因为它们没有找到所有的问题:
。
在一定百分比的堆栈上看到的任何代码,如果删除,都会节省执行时间的百分比(或多或少)。你不能出错。Here's an example,经过多次迭代,节省了97%以上。
https://stackoverflow.com/questions/3168046
复制相似问题