`
lovnet
  • 浏览: 6711378 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

真相,看问题的层次

阅读更多

真相,看问题的层次

真相,看问题的层次
原贴地址:
http://eparg.spaces.live.com/blog/cns!59BFC22C0E7E1A76!2274.entry
原贴时间:
2006-12-26
原贴作者:
eparg

先看问题:
题目很简单吧,用C#执行pow(2)的性能比C++执行pow(2)的性能慢了一个数量级.大家先想想看.
我,Support Engineer:
从我这个support engineer的层次来说呢,二话不说先祭出reflector,profiler和windbg三大武器了.Reflector看到pow方法是InternalCall属性,所以猜想问题应该在C#和CLR Engine的context switch上。然后用profiler测了一把,果然,大量的时间消耗在了mscorwks上面。最后,用windbg随即breakin检查callstack,发现调用往往停留在
0:000> kL
ChildEBP RetAddr
0013f3d8 7a296970 MSVCR80!_pow_pentium4+0x313
0013f480 79e88f63 mscorwks!COMDouble::PowHelper+0x8a
0013f510 79e88e31 mscorwks!CallDescrWorker+0x33
0013f650 79e88d19 mscorwks!MethodDesc::CallDescr+0x19c
0013f668 79e88cf6 mscorwks!MethodDesc::CallTargetWorker+0x20
0013f67c 79f084b0 mscorwks!MethodDescCallSite::Call_RetArgSlot+0x18
0013f7e0 79f082a9 mscorwks!ClassLoader::RunMain+0x220
0013fa48 79f0817e mscorwks!Assembly::ExecuteMainMethod+0xa6
0013ff18 79f07dc7 mscorwks!SystemDomain::ExecuteMainMethod+0x398
0013ff68 79f05f61 mscorwks!ExecuteEXE+0x59
好吧,有了三个铁的证据,C#的代码通过InternalCall把调用传递给了CRT。C++也是通过 CRT调用。唯一的差别就是C#通过InternalCall进去的,那问题就在这个context switch上了
Developer:
我把这个问题发到内部讨论组上后,一个developer先回我了。大意是,乃不就计算一个平方么,用什么 pow函数阿,直接用乘法不是更快么?
修改代码,用乘法替换pow后,C#跟C++性能就一样了。
看到了吧,用什么reflector, windbg,代码本身就在乱掉函数,如果代码写得对,这个问题就不存在!
回到我:
可是我还是死脑精啊。用乘法的确快,但是我一定要用pow呢,有没有办法让C#快点啊!

SOFTWARE ARCHITECT:
这个时候,一个SOFTWARE ARCHITECT跳出来了。列出四点:

1. 你说问题出在context switch,这点很值得怀疑
2. 如果jit真的编译除了效率不高的代码,我们应该找jit的原因
3. C++编译器优化可以自动把pow转换成乘法,jit好像不会做这么复杂的工作
4. 事实上是,C#做出来的工程,哪怕在复杂计算方面,跟C++相比也非常有竞争力
回到我:
ARCHITECT说得很有道理啊。于是我重新拿windbg开始分析。果然,问题不在InternalCall上。问题在于:
1. pow函数接受的参数定义为double,也就是说pow可以做浮点指数运算。浮点指数运算比整数指数运算复杂多了,如果用CPU的一些优化,比如MMX,可以提高效率
2. C++看到pow(2),直接优化为乘法,同时还inline,避免调用浮点指数运算来提高效率
3. jit看到internalcall,简单判断后直接生成对CRT的调用,所以就没有优化为乘法这一步.最后就把这个2当成浮点数在计算,所以慢了
4. 察看InternalCall的调用,其实就是一个简单的call,根本没有什么context switch.
为了印证上面的说法,把pow(2)修改为pow(2.5),测试下来,C#比C++还快了5秒!赶紧认错去.
看到了吧,我跟ARCHITECT的层次差了多少

Senior Developer:
故事才刚开始,一个Senior Developer看到了,给出一些链接,讨论了CLR,Java这样的动态编译优化技术,同时也有人建议CLR可以带一个跟C++编译器一样,虽然比较大,但是能够尽可能优化代码的编译引擎出来
ARCHITECT:
另外一个CLR Team的CLR于是出现了.说CLR的确考虑过带一个这样的编译引擎的.但是考虑到下面两点,在目前的版本上不会实现这样的引擎:
1. 目前有专门的研究团队在研发这样的通用优化技术.这个技术出来后,CLR就可以使用
2. 在当前情况下引进复杂的编译引擎开销太大
PRINCIPAL RESEARCHER:
这个时候,研究院的PRINCIPAL RESEARCHER出来了,介绍了一下当前该项技术的进展.当前研究的这项技术是非常抽象的,研究出来后可以直接用于各种编译环境,到时候C++编译器都会用这个技术重写.目前进展不错,前景可观,但是难题也不少
GENERAL MANAGER:
在PRINCIPAL RESEARCHER的激情介绍后,一个管研发的GENERAL MANAGER出来了,说你这个优化技术2001年就承诺大家可以出来了,到现在都CLR3.0了还不出来,怎么回事呢?
Senior ARCHITECT
负责优化的Senior ARCHITECT出来说话了,说这个技术目前在实验室里面已经可以用于CLR了。01年研究团队只有3个人,现在有70多个人了。这个技术非常重要,有非常长远的考虑和影响,考虑到诸多因素,所以需要非常谨慎地进行

......

在这后面,又有无数的RESEARCHER,SDET Lead, ARCHITECT, Senior Programmer出来,讨论这个优化技术的进展。具体内容就不在这里讨论了。总之呢,不同的人,看问题的态度和高度是灰常不一样的。
你我还错过了多少真相?
分享到:
评论

相关推荐

    华为真相 一个真正的华为

    听老板的就错了 华为真相:错不在听老板的……  华为一直处于凶猛无比的扩张中,任正非自比为“狼”,媒体则把华为与跨国公司...针对不同对手、不同情况,采用不同的方式,开发不同层次的技术。这就是华为的技术策略。

    《华为真相完整版》真正的完整电子版

    简介:华为真相完整版 此书写作的根本目的,是对中国最大民营企业命运走向的关注,对民营高科技公司发展过程的深层次解剖,对中国最具争议的企业和企业家进行人文关照。 华为如同一头展翅飞翔的雄鹰一样,已经具备...

    基于加权计算的焦煤煤岩亚组分基础特性

    为了深层次解析煤岩组成对原料煤加工利用过程的影响,选取煤岩亚组分作为考察因素并研究其基础特性,基于煤岩亚组分真相对密度、挥发分、元素组成等指标的加权特性,采用试验分析与数学计算相结合的方法研究了代表性...

    matlab提取轮廓代码-face_video_segment:脸部视频分割-视频中的脸部分割地面真相

    matlab提取轮廓代码脸部视频分割-视频中的脸部分割地面真相 面部视频分段编辑器的快照。 , , , , 和 。 概述 该项目包含用于从视频中半监督收集地面真实面Kong分割数据的工具集合。 使用[2]的方法从密集的光流中...

    UnsupervisedGloveAction:手动交互的层次模型的无监督学习(ICRA 2018)

    手动交互的层次模型的无监督学习(ICRA 2018) 集群管道的源代码/ ACA优化/推理标记用法$ git clone 聚类使用“ main.m”作为“群集”文件夹中的条目以启动群集管道样本手数据放置在“ Clustering / hand_data”中...

    网络调研报告格式.doc

    我们看看下面吧! 调研报告要用能提醒内容中心的标题,详细写法有以下几种: (1)调研报告标题——公文式标题。这类调研报告标题多数由事由和文种构成,平实 沉稳,如《关于知识分子经济生活状况的调研报告》;也有...

    reinforced-agglomerative-clustering:学习通过强化学习进行聚集聚类

    是层次聚类的一种“自下而上”的方法,其中每个观察值都在其自己的聚类中开始,并且随着一个聚类向上移动,聚类对将合并。 聚集聚类是一个顺序决策问题,它伴随着一个问题,即较早做出的决定会影响较晚的结果。 ...

    大数据时代读后感(4).doc

    在此,也有一些自己的思考:如果说搜索引擎所解决的问题表面上是帮助用户找到需要 的信息,而实质是帮助企业找到拥有某项需求的客户,深层次讲是解决了《第三次浪潮》 中提出的消费者和生产者分离的根本矛盾,如果...

    大数据时代.doc

    相对依赖于小数据和精确性的时代,大数据因为更强调数据的完整性和混杂性,帮助我 们进一步接近事实的真相,部分和确切的吸引力是可以理解的,但是,当我们的视野局 限在我们可以分析和能够确定的数据上时,我们对...

    大数据时代数据挖掘与分析-讲义.pdf

    "行动的力量" 数据分析是为了产生知识 提升的层次 信息 知识 数据 管 理 者 关 注 度 低 高 最原始的数值 有价值的数据 用于解决问题的信息 为什么进行数据分析与挖掘? 产品体系丰富 数据分析 数据挖掘 效益/业绩...

    hof:高代码框架(针对开发人员的低代码)

    该hof工具试图通过使用高层次的设计,代码生成和diff3的同时让你直接在输出编写自定义代码删除redundent开发活动。 (针对开发人员的低代码) 用户为数据模型和应用程序生成器编写单一真相(SSoT)设计 hof读取SSOT...

    microapps-bundles

    高层次的设计 源存储库由三个主要目录组成。 bundles :捆绑软件目录,元数据,数据文件〜真相来源。 bundlegen :一种工具,用于验证源包目录并将其转换为目标表单。 .github : (CI / CD管道),执行bundlegen...

    discotech:插入式服务发现,负载平衡,连接预取

    在较低的层次上,它通过挂钩getaddrinfo和connect起作用。 这允许各种高性能和灵活的模式: 通过检测频繁的相同连接请求并准备好新的套接字以进行下一个连接调用而不必等待往返,来进行连接预取。 通过在get...

    upptackt:和M.Eng

    然后,该系统使用符号模式匹配和基于传播器的真相维护系统来适当地概括发现并提出新发现的东西。定理。 这些定理可以使用外部证明助手进行严格证明,但也可以由系统用来协助其探索新的更高层次的概念。 通过一系列...

    【精品资料】零基础搭建企业培训体系全流程.zip

    人力资源-培训成败的十大真相(DOC 8页) 人力资源-人才培训是资本而非成本(DOC 8页) 人力资源管理之如何做好企业的培训管理(PPT 17页) 二、体系制度 01-宝洁公司特色培训-21页 03-海尔集团 培训管理手册 39页 04-...

    网络暴力数据分析.doc

    在这个复杂的网络背景下,网络的 自我价值实现催生"键盘侠",言论暴力升级为现实暴力[3],每年因为遭受网络暴力而患 上严重抑郁症的,甚至最后走上自杀道路的例子层次不穷,造成了无数的悲剧。因此, 我们必须意识到...

Global site tag (gtag.js) - Google Analytics