Sri*_*aju 43 c c++ optimization assembly compiler-optimization
我记得在某处可以真正优化和加速代码的某些部分,程序员用汇编语言编写该部分.我的问题是 -
我正在努力理解这个概念,非常感谢任何帮助或链接.
更新:根据dbemerlin的要求改写第3点 - 因为您可能能够编写比编译器生成的更有效的汇编代码,但除非您是汇编专家,否则您的代码运行速度会慢,因为编译器通常会比大多数人更好地优化代码.
Ton*_*roy 28
恢复汇编语言唯一有用的时间是
CPU指令在C++中没有功能等价物(例如,单指令多数据指令,BCD或十进制算术运算)
<cstdlib>
有div
/ldiv
等用于有效地获得商和余数)要么
出于某种莫名其妙的原因 - 优化器未能使用最佳CPU指令
...和...
简单地使用内联汇编来执行可以在C++中轻松表达的操作 - 比如添加两个值或在字符串中搜索 - 会起到反作用,因为:
gcc -S
)或反汇编机器代码#ifdef
为您的平台的最低公分母或-ed我认为值得记住的一个观点是,当C被引入时,它必须赢得许多核心汇编语言程序员,他们对生成的机器代码感到困惑.机器当时拥有较少的CPU功率和RAM,你可以打赌人们对最微小的东西感到困惑.优化器变得非常复杂并且不断改进,而x86等处理器的汇编语言变得越来越复杂,执行管道,缓存和其他因素也越来越复杂.您不能再添加每个指令周期表中的值.编译器编写者花时间考虑所有这些微妙因素(特别是那些为CPU制造商工作的因素,但这也增加了其他编译器的压力).它' 现在,对于汇编程序员来说,平均而言 - 对于任何非平凡的应用程序而言 - 显着提高代码效率比使用优秀的优化编译器所产生的效率要高得多,并且它们极可能会更糟糕.因此,组装的使用应限制在实际产生可测量和有用的差异的时间,值得耦合和维护成本.
sha*_*oth 14
首先,您需要描述您的程序.然后,您可以在C或C++代码中优化最常用的路径.除非优点明确,否则不要在汇编程序中重写.使用汇编程序会使代码更难维护而且便携性更低 - 除非在极少数情况下,否则它是不值得的.
And*_*nck 10
(1)是的,最简单的尝试方法是使用内联汇编,这是依赖于编译器的,但通常看起来像这样:
__asm
{
mov eax, ebx
}
Run Code Online (Sandbox Code Playgroud)
(2)这是非常主观的
(3)因为您可能能够编写比编译器生成的更有效的汇编代码.
你应该阅读经典书籍Zen of Code Optimization
和后续Zen of Graphics Programming
由迈克尔·亚伯拉什。
在第一本书中,他总结了如何使用极限编程的汇编程序。在后续文章中,他解释说程序员应该宁愿使用某种高级语言(如C),并且仅在必要时才尝试使用汇编来优化非常特定的位置。
这种改变主意的动机是,他发现,与从高级语言编译的代码(也许是使用新指令的编译器)相比,针对一代处理器的高度优化的程序可能在同一个处理器的下一代系统中变慢(某种程度上)。例如,或者现有处理器的性能和行为从处理器一代转变为另一处理器)。
另一个原因是,如今的编译器非常好,并且可以进行积极的优化,通常可以得到更高的性能,从而可以处理将C代码转换为汇编语言的算法。即使对于GPU(图形卡处理器)编程,也可以使用cuda或OpenCL使用C进行编程。
在某些情况下,您应该(必须)使用汇编程序,通常是为了对硬件进行很好的控制。但是即使在OS内核代码中,它通常也只是很小的一部分,而不是那么多的代码。