- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
c⽐汇编语⾔慢多少,什么时候汇编⽐C更快?
已知的了解汇编器的原因之⼀是,有时可以⽤它来编写⽐⽤⾼级语⾔(尤其是C)编写更⾼性能的代码。
但是,我也听到过很多次声明,尽管这并⾮完全错误,但实际上可将汇编程序⽤于⽣成更多性能代码的
情况极为罕见,并且需要汇编⽅⾯的专业知识和经验。
这个问题甚⾄都没有涉及到汇编程序指令将是特定于机器且不可移植的,或者汇编程序的任何其他⽅
⾯。 当然,除了汇编语⾔之外,还有很多了解汇编语⾔的充分理由,但这是⼀个特定的问题,需要征集
⽰例和数据,⽽不是对汇编语⾔和⾼级语⾔的扩展论述。
谁能提供⼀些特定的例⼦ , 说明使⽤现代编译器进⾏汇编⽐编写良好的C代码要快得多,并且您可以提
供带有分析依据的主张吗? 我对这些案例的存在很有信⼼,但是我真的想确切地知道这些案例有多深
奥,因为这似乎有些争议。
#1楼
根据我的经验,有⼏个例⼦:
访问⽆法从C访问的指令。例如,许多体系结构(如x86-64 ,IA-64 ,DEC Alpha和64位MIPS或PowerPC)⽀
持64位乘64位乘法,产⽣128位结果。 GCC最近添加了扩展名,以提供对此类说明的访问,但是在需要
该程序集之前。 当实施RSA之类的东西时,访问此指令可能对64位CPU产⽣巨⼤的影响-有时性能会提⾼
4倍。
访问特定于CPU的标志。 咬住我很多的是进位标志; 在进⾏多精度加法运算时,如果您⽆法访问CPU进
位,则必须⽐较结果以查看其是否溢出,这每条肢体需要3-5条指令; 更糟糕的是,就数据访问⽽⾔,
这是串⾏的,这会破坏现代超标量处理器的性能。 当连续处理成千上万个这样的整数时,能够使⽤addc
是⼀个巨⼤的胜利(进位位上的争⽤也存在超标量问题,但现代CPU处理起来很不错)。
SIMD。 即使是⾃动向量化的编译器也只能处理相对简单的情况,因此,如果要获得良好的SIMD性能,
通常常常需要直接编写代码。 当然,您可以使⽤内部函数⽽不是汇编程序,但是⼀旦您进⼊内部函数级
别,则基本上⽆论如何都在编写汇编程序,只是将编译器⽤作寄存器分配器和(名义上)指令调度程序。
(我倾向于将内在函数⽤于SIMD只是因为编译器可以为我⽣成函数序⾔,⽽不是为我⽣成函数序⾔,因
此我可以在Linux ,OS X和Windows上使⽤相同的代码⽽不必处理函数调⽤约定之类的ABI问题,但其他
⽐SSE内在函数确实不是很好-Altivec的内在函数似乎更好,尽管我对它们没有太多经验。 作为⼀个事
例,(当今)⽮量化编译器⽆法弄清楚,请阅读有关位⽚化AES或SIMD纠错的信息 -可以想象⼀个编译器
可以分析算法并⽣成这样的代码,但在我看来,这就像⼀个聪明的编译器距现有(⾄少)⾄少30年。
另⼀⽅⾯,多核计算机和分布式系统已将许多最⼤的性能优势转移到了另⼀个⽅向上-将内部循环以汇编
形式编写可额外提⾼20%的速度,或者通过在多个内核上运⾏它们来实现300%的加速,或在10000%的
速度下达到10000%在⼀组机器上运⾏它们。 当然,使⽤ML或Scala这样的⾼级语⾔⽐使⽤C或asm进⾏
⾼级优化(诸如期货,备忘录等之类的东西)通常要容易得多,并且通常可以带来更⼤的性能优势。因
此,⼀如既往,需要进⾏权衡。
#2楼
简单的答案... 知道汇编的⼈ (⼜有他的参考,并且利⽤每⼀个⼩的处理器⾼速缓存和管道功能等)可以保
证⽐任何编译器产⽣更快的代码。
但是,这些天的差异在典型应⽤中⽆关紧要。
#3楼
从汇编编码器的⾓度来看,C经常⽐您想像的要多做不必要的事情,因为C标准如此说。
例如,整数提升。 如果要在C中移动char变量,通常会希望代码实际上只是这样做,即⼀次移位。
但是,这些标准强制编译器在移位之前对int进⾏符号扩展,然后将结果截断为char ,这可能会使代码复
杂化,具体取决于⽬标处理器的体系结构。
#4楼
Longpoke ,只有⼀个限制:时间。 如果您没有⾜够的资源来优化代码的每个更改,并花时间分配寄存
器,优化少量溢出,⽽没有的话,则编译器将每次都获胜。 您对代码进⾏修改,重新编译和测量。 如
有必要,请重复。
另外,您可以在⾼级⽅⾯做很多事情。 同样,检查⽣成的程序集可能会使IMPRESSION感觉到代码已被
废弃,但实际上它的运⾏速度要⽐您认为的更快。 例:
int y = data [i]; //在这⾥做⼀些事情.. call_function(y ,...);
编译器将读取数据,将其压⼊堆栈(溢出) ,然后从堆栈中读取并作为参数传递。 听起来很糟糕? 它实际
上可能是⾮常有效的延迟补偿,并且可以加快运⾏时间。
//优化的版本call_function(d
您可能关注的文档
- 2022年医院护士离职报告.pdf
- Java新手练习题库.pdf
- 2021年仓储述职报告模板与2021年仓储述职报告范文.pdf
- 2020年二建考试施工管理练习题及答案(2).pdf
- 【上海教育版】英语六年级下册:Unit 9《reusing things》教案(Word版)【精校版】.pdf
- 2021-2022学年人教版数学三年级上册4.5万以内数的退位减法.pdf
- 《电子乙状结肠镜临床应用专家共识(2020版)》要点.pdf
- 24数控铣床、加工中心常用夹具.pdf
- 2021-2022学年人教版数学三年级下册1.1认识东、南、西、北(I)卷.pdf
- ecovacs扫地机器人使用说明书cr630.pdf
文档评论(0)