性能调优难题

moolleychean 2013-03-03 07:51:27
下图为vs2010采用CPU采样的性能分析报告(release版本),其中红线部分相当困惑,为什么开销这么大?



release的反汇编如下:



debug的反汇编如下:


从反汇编来看,release将cmp优化成test。
...全文
335 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
moolleychean 2013-03-10
  • 打赏
  • 举报
回复
引用 25 楼 raison_x 的回复:
引用引用 22 楼 raison_x 的回复:

引用引用 15 楼 raison_x 的回复:
引用 13 楼 moolleychean 的回复:引用 11 楼 raison_x 的回复:这个差别貌似可以忽略不计。
那个1.1%就算降到0.1%也没有意义。
道理没错,不是主要的开销,但是不明不白的出现这么……


之前的两个问题已经弄明白了,page fault 分为 hard和soft两种。

首页的问题我现在更倾向于CPU采样的不准确性导致的。
在整个测试过程中除了帖子中列出的,实际上还有一些不太理解的较大的开销,比如:

update_user_ip_kpi函数逻辑也很简单,一些比较和加法语句而已,但是与主处理逻辑相比开销是其差不多30%。
使用检测方式重新测量的结果如下:

两者的比值就只有不到7%了。
moolleychean 2013-03-08
  • 打赏
  • 举报
回复
引用 17 楼 givemekey 的回复:
单纯看汇编不会这么慢,是不是后面的跳转遇到上下文切换了。Lz多测几次,取个平均看看
测了很多次了,差不多没有什么变化。
moolleychean 2013-03-08
  • 打赏
  • 举报
回复
引用 18 楼 zhao4zhong1 的回复:
擒贼先擒王!
我对于技术的态度是,知其然,更要知其所以然。虽然我的行业是移动通信,但是对于C++开发的态度是一致的。
moolleychean 2013-03-08
  • 打赏
  • 举报
回复
引用 15 楼 raison_x 的回复:
引用 13 楼 moolleychean 的回复:引用 11 楼 raison_x 的回复:这个差别貌似可以忽略不计。
那个1.1%就算降到0.1%也没有意义。

道理没错,不是主要的开销,但是不明不白的出现这么一个不合情理的开销,心里头不舒服。

test & jne/je 不可能会带来这么大的开销,可能这个问题不在于 line 26,而在于 line……


这个可能在点子上了,我也怀疑是数组取值的问题,这个数组有1M,参看下面一个64k的数组取值:


红色部分效率不高,之前是这么写的:

if (cell_id_array_[bvci] == 0) {
helper_->update_bssgp_dl_unitdata__stats(BSSGP_DL_UNITDATA_CELL_UNFOUND);
return;
}
bssgp_unitdata_head.cell_id = cell_id_array_[bvci];

那个0.6%的CPU占用就出在if (cell_id_array_[bvci] == 0)这一行。

是否可能页面错误导致?这一块我不是很熟悉,但是我将windows的虚拟内存完全禁用后,程序的页面错误变化不大。
是否可能CPU cache命中率太低导致?对于这种大数组,不可能全部读进cache。
赵4老师 2013-03-08
  • 打赏
  • 举报
回复
擒贼先擒王!
  • 打赏
  • 举报
回复
单纯看汇编不会这么慢,是不是后面的跳转遇到上下文切换了。Lz多测几次,取个平均看看
raison_x 2013-03-08
  • 打赏
  • 举报
回复
引用
引用 22 楼 raison_x 的回复: 引用引用 15 楼 raison_x 的回复: 引用 13 楼 moolleychean 的回复:引用 11 楼 raison_x 的回复:这个差别貌似可以忽略不计。 那个1.1%就算降到0.1%也没有意义。 道理没错,不是主要的开销,但是不明不白的出现这么一个不合情理的开销,心里头不舒服。 test & jne/je 不可…… “如果你监测到了页面错误较多,说明内存吃紧”,这句是错误的。 以下问题搞不明白: 将windows虚拟内存完全禁用后,内存会交换到什么地方? 如果没有磁盘分页文件可以交换,为什么还会出现page fault?
以下假设所说的页面错误指 Page Fault. 如果已经将虚拟内存完全禁用了,那应该不存在内存和页面文件的交换。这时出现 page fault 可以忽略,它仍然是从物理内存读写,而且我们也没有确定是在那个时间点发生了 page fault。 你的 i7 有6M的cache,程序应该还是蛮大机会占用一点的。如果是因为数组太大导致cache的切换,而导致CPU消耗偏多的话,也是有可能的,0.8/0.1 = 8,和内存/cache速率比也相近。进行每条语句的消耗时间探测的话,每条语句之间都要有探针代码,实际在CPU里面运行的情况要比汇编代码所显示的复杂。 虽然未能肯定是何原因,但是和内存存取紧密相关这一点是最可能的。或者试下改变 line 25 的数组的大小,从1k到1M不等,对比看看。
ma100 2013-03-08
  • 打赏
  • 举报
回复
一个简单语句被调用100000次也会比复杂指令调用1次耗时
raison_x 2013-03-08
  • 打赏
  • 举报
回复
引用 13 楼 moolleychean 的回复:
引用 11 楼 raison_x 的回复:这个差别貌似可以忽略不计。 那个1.1%就算降到0.1%也没有意义。 道理没错,不是主要的开销,但是不明不白的出现这么一个不合情理的开销,心里头不舒服。
test & jne/je 不可能会带来这么大的开销,可能这个问题不在于 line 26,而在于 line 25. 你在 line 25 后面弄个简单的语句试试看,比如一个简单的加法运算,有可能这个简单的加法会让我们吃一惊。
moolleychean 2013-03-08
  • 打赏
  • 举报
回复
引用 23 楼 moolleychean 的回复:
引用 22 楼 raison_x 的回复:引用引用 15 楼 raison_x 的回复:
引用 13 楼 moolleychean 的回复:引用 11 楼 raison_x 的回复:这个差别貌似可以忽略不计。
那个1.1%就算降到0.1%也没有意义。
道理没错,不是主要的开销,但是不明不白的出现这么一个不合情理的开销,心里头不舒服。
……


忘了说配置了:


moolleychean 2013-03-08
  • 打赏
  • 举报
回复
引用 22 楼 raison_x 的回复:
引用引用 15 楼 raison_x 的回复:
引用 13 楼 moolleychean 的回复:引用 11 楼 raison_x 的回复:这个差别貌似可以忽略不计。
那个1.1%就算降到0.1%也没有意义。
道理没错,不是主要的开销,但是不明不白的出现这么一个不合情理的开销,心里头不舒服。
test & jne/je 不可……



“如果你监测到了页面错误较多,说明内存吃紧”,这句是错误的。
这个图还是在将windows虚拟内存完全禁用后截取的:

以下问题搞不明白:
将windows虚拟内存完全禁用后,内存会交换到什么地方?
如果没有磁盘分页文件可以交换,为什么还会出现page fault?
raison_x 2013-03-08
  • 打赏
  • 举报
回复
引用
引用 15 楼 raison_x 的回复: 引用 13 楼 moolleychean 的回复:引用 11 楼 raison_x 的回复:这个差别貌似可以忽略不计。 那个1.1%就算降到0.1%也没有意义。 道理没错,不是主要的开销,但是不明不白的出现这么一个不合情理的开销,心里头不舒服。 test & jne/je 不可能会带来这么大的开销,可能这个问题不在于 line 26,而在于 line…… 这个可能在点子上了,我也怀疑是数组取值的问题,这个数组有1M,参看下面一个64k的数组取值: ...... 是否可能页面错误导致?这一块我不是很熟悉,但是我将windows的虚拟内存完全禁用后,程序的页面错误变化不大。 是否可能CPU cache命中率太低导致?对于这种大数组,不可能全部读进cache。
如果你监测到了页面错误较多,说明内存吃紧,已经发生了较多的磁盘交换内存页面了,那会有影响,用 profiler 监测的时候,profiler 和你的程序是一起跑的,profiler要做更多的工作,消耗更多的内存,这也会导致你的程序内存紧张。 CPU cache命中率对单条语句的影响不会这么夸张,这么大的影响更有可能是背后发生了磁盘操作。如果可能的话,修改一下程序,改成直接的物理内存(不用malloc/new)试试看。
moolleychean 2013-03-07
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
我只注意到楼主提供图片中的 6.1% 32 …… 39.1% 40 ……
6.1%的这个差不多到极限了,对象的数目太多了,上百万。 改用boost::unordered_map效率稍微好点,不过会增clean线程和锁的开销,总体差不多。 39.1%的是后面的主处理流程,正在进一步优化。
moolleychean 2013-03-07
  • 打赏
  • 举报
回复
引用 11 楼 raison_x 的回复:
这个差别貌似可以忽略不计。 那个1.1%就算降到0.1%也没有意义。
道理没错,不是主要的开销,但是不明不白的出现这么一个不合情理的开销,心里头不舒服。
赵4老师 2013-03-07
  • 打赏
  • 举报
回复
我只注意到楼主提供图片中的 6.1% 32 …… 39.1% 40 ……
raison_x 2013-03-07
  • 打赏
  • 举报
回复
这个差别貌似可以忽略不计。 那个1.1%就算降到0.1%也没有意义。
moolleychean 2013-03-04
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong2 的回复:
用C语言1000行源码能完成的工作千万不要用C++重写!
您回错帖了吧!
moolleychean 2013-03-04
  • 打赏
  • 举报
回复
引用 6 楼 zilaishuichina 的回复:
if的命中率的问题吧


很不幸,不是


反汇编出来只是将jne改成了je
zhao4zhong2 2013-03-04
  • 打赏
  • 举报
回复
用C语言1000行源码能完成的工作千万不要用C++重写!
zilaishuichina 2013-03-04
  • 打赏
  • 举报
回复
if的命中率的问题吧
加载更多回复(6)
《全栈性能测试修炼宝典 JMeter实战》是软件测试领域里程碑式的重要著作,由多位培养出经理级乃至总监级性能高手的大师联手创作,本书深入讲解了性能测试实践操作过程中诸多难题的调优心法,实现从理论到实操的升华。列出自学所需的性能技能目录树,助力测试小白迅速成长为技术大牛。从脚本到运维、公式到指标的运用掌握应有尽有,手把手教你性能测试技巧。此书在手,助你走出迷茫。   内容推荐   “基础篇”:欲练神功,不必自宫。打我基础,从此坦途。   “工具篇”:欲善其事,先利其器。神剑在手,天下任走。   “实践篇”:练武无功,到老皆空。有武有功,江湖轻松。   “提升篇”:江湖之大,无奇不有。融会贯通,相忘江湖   首部分:基础篇   帮助初学者或想踏入这个行业的工程师迅速了解除工具以外的性能测试的真实本质。去伪求真,使读者能够把握性能测试要点和难点及职业规划有进一步的认识。不管你是内行还是外行,读完后必有所获。   第二部分:工具篇   可当JMeter工具书来进行查阅,是市面上目前为止比较全面的JMeter讲解工具。学会热门的负载工具JMeter,对各种常见协议的性能测试工作(包括自动化测试) 测试脚本不用愁。   第三部分:实践篇   可学到Linux、Windows平台的性能监控、诊断分析;炼就火眼金睛,见微知著的技能;性能问题快速定位。   适合中高级性能测试工程师阅读,掌握性能分析方法,学会如何调优,了解当前的性能调优手法。   可跟书中实例操作,掌握性能测试整个过程,包括需求分析、测试计划、脚本开发、测试数据制作、测试执行、测试结果诊断分析、性能调优整个过程,真正能够开始进行性能测试工作。   第四部分:提升篇   性能测试自动化(Jenkins+Ant+JMeter),能够很方便的实现性能测试回归。提高产率,更少的人力,更低的功耗,更高的生产率;老板怎么爱你都不算多。   另外,前端的性能表现会直接影响到客户体验,前端性能测试也将成为新的性能点,读者可以更深层的了解此方面的知识。
《全栈性能测试修炼宝典 JMeter实战》是软件测试领域里程碑式的重要著作,由多位培养出经理级乃至总监级性能高手的大师联手创作,本书深入讲解了性能测试实践操作过程中诸多难题的调优心法,实现从理论到实操的升华。列出自学所需的性能技能目录树,助力测试小白迅速成长为技术大牛。从脚本到运维、公式到指标的运用掌握应有尽有,手把手教你性能测试技巧。此书在手,助你走出迷茫。   内容推荐   “基础篇”:欲练神功,不必自宫。打我基础,从此坦途。   “工具篇”:欲善其事,先利其器。神剑在手,天下任走。   “实践篇”:练武无功,到老皆空。有武有功,江湖轻松。   “提升篇”:江湖之大,无奇不有。融会贯通,相忘江湖   首部分:基础篇   帮助初学者或想踏入这个行业的工程师迅速了解除工具以外的性能测试的真实本质。去伪求真,使读者能够把握性能测试要点和难点及职业规划有进一步的认识。不管你是内行还是外行,读完后必有所获。   第二部分:工具篇   可当JMeter工具书来进行查阅,是市面上目前为止比较全面的JMeter讲解工具。学会热门的负载工具JMeter,对各种常见协议的性能测试工作(包括自动化测试) 测试脚本不用愁。   第三部分:实践篇   可学到Linux、Windows平台的性能监控、诊断分析;炼就火眼金睛,见微知著的技能;性能问题快速定位。   适合中高级性能测试工程师阅读,掌握性能分析方法,学会如何调优,了解当前的性能调优手法。   可跟书中实例操作,掌握性能测试整个过程,包括需求分析、测试计划、脚本开发、测试数据制作、测试执行、测试结果诊断分析、性能调优整个过程,真正能够开始进行性能测试工作。   第四部分:提升篇   性能测试自动化(Jenkins+Ant+JMeter),能够很方便的实现性能测试回归。提高产率,更少的人力,更低的功耗,更高的生产率;老板怎么爱你都不算多。   另外,前端的性能表现会直接影响到客户体验,前端性能测试也将成为新的性能点,读者可以更深层的了解此方面的知识。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧