汇编中的局部变量:它们比全局变量快吗?

Local variables in assembly:are they faster than global variables?

本文关键字:全局变量 局部变量 汇编      更新时间:2023-10-16

我想知道汇编中的局部变量是否比我们使用的全局变量更快。背景是,我正在学习一些2d动画使用win32 api,从一本书。作者使用了一个函数来初始化(创建、注册、显示和更新窗口)程序的主窗口。我用asm写了这个函数(只是为了练习一些asm)。所以,我想知道是否有任何性能优势,因为在我使用的asm函数中,WNDCLASSEX结构是在本地(在堆栈中)创建的。我知道汇编中的局部变量应该更快,但是在对另一个程序进行反汇编(完全在cpp中)之后,我注意到编译器也在本地创建了WNDCLASSEX。这使我对这个话题感到困惑。所以我想知道在asm代码和c++代码之间是否有任何性能差异。

Devjeet

堆栈的顶部被很多代码触及。这意味着堆栈的顶部通常在CPU缓存中。访问此内存区域将比访问其他内存区域(从.bss等)更快。

但是对于像CreateWindow这样的函数,每个程序只调用几次,这并不重要。差别不到几百个CPU周期。对于代码的其他部分,差异可能更加明显。但是需要注意的重要一点是,如果您对同一块数据重复执行相同的操作,那么数据也将最终进入CPU缓存,因此性能差异将被抵消。

老实说,我认为您应该把这些决定留给编译器。编写编译器的人已经花了很多人年的时间来优化代码,所以对于99%的应用程序来说,几乎没有理由担心这些事情。在1%的情况下,当你编译时,做一个程序集清单并检查代码,因为在那里你可能会获得一个或两个周期。

没有你的代码判断,我有一个建议:

过去,汇编语言是编写快速程序的好方法。但是,现在有了第三方库、复杂的算法、编译器的智能优化、可移植性问题以及cpu和内存速度的巨大改进,这种方法已经过时了。

甚至,根据我的经验,手工编写的汇编代码可能会对代码的性能产生不良影响,因为编译器不能在该汇编块中生成智能代码。

在高级语言中使用汇编代码的另一个不好的事情是阻止代码的可移植性。

注意:然而,对于某些机器和系统来说,汇编编码是很好的