首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VC6 Profiler问题:虚假函数调用

VC6 Profiler问题:虚假函数调用
EN

Stack Overflow用户
提问于 2010-07-02 18:00:19
回答 2查看 158关注 0票数 1

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

代码语言:javascript
复制
int SomeClass::getId() const
{
   return m_iId;
};

问题是,这个方法在测试应用程序中没有被调用。当我将代码更改为以下代码时:

代码语言:javascript
复制
int SomeClass::getId() const
{
   std::cout << "Is this method REALLY being called?" << std::endl;
   return m_iId;
};

分析器从未在调用的函数列表中包括getId。评论掉cout,我就回到我开始的地方,130+千次电话!为了确保不是缓存的分析器数据或损坏的函数查找表,我正在每个测试之间进行清理和重建。结果还是一样的!

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-02 18:03:49

我猜想,所发生的事情是编译器和/或链接器将这个非常简单的函数“合并”到一个或多个相同的其他函数(为return m_iId生成的代码可能与返回位于相同偏移量的成员的其他getter完全相同)。

本质上,一组碰巧具有相同的机器代码实现的不同函数都被解析到相同的地址,从而混淆了分析器。

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

票数 3
EN

Stack Overflow用户

发布于 2010-07-02 21:21:24

我认为您是在分析,因为您想知道是否有办法使程序花费更少的时间,对吗?你不只是因为你喜欢看数字而进行侧写。

有一个简单的,老式的,尝试和真实的方法来发现性能问题。当程序运行时,只需点击“暂停”按钮并查看调用堆栈。做几次,比如从5次到20次。问题越大,你需要找到的样本就越少。

有些人会问,这是否基本上不是分析器所做的,而答案却很少。Most profilers fall for one or more common myths,其结果是您的加速速度有限,因为它们没有找到所有的问题:

  • 一些程序在“热点”中花费了不必要的时间。在这种情况下,您将看到堆栈“末端”的代码(程序计数器所在的地方)正在做不必要的工作。
  • 有些程序做的I/O比需要的要多。如果是这样的话,您将看到它们正在执行I/O.
  • 大型程序通常是缓慢的,因为它们的调用树不必要地繁忙,需要修剪。如果是这样,您将看到不必要的函数调用堆栈中的.

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3168046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档