汇编中的局部变量:它们比全局变量快吗?
Local variables in assembly:are they faster than global variables?
我想知道汇编中的局部变量是否比我们使用的全局变量更快。背景是,我正在学习一些2d动画使用win32 api,从一本书。作者使用了一个函数来初始化(创建、注册、显示和更新窗口)程序的主窗口。我用asm写了这个函数(只是为了练习一些asm)。所以,我想知道是否有任何性能优势,因为在我使用的asm函数中,WNDCLASSEX结构是在本地(在堆栈中)创建的。我知道汇编中的局部变量应该更快,但是在对另一个程序进行反汇编(完全在cpp中)之后,我注意到编译器也在本地创建了WNDCLASSEX。这使我对这个话题感到困惑。所以我想知道在asm代码和c++代码之间是否有任何性能差异。
Devjeet
堆栈的顶部被很多代码触及。这意味着堆栈的顶部通常在CPU缓存中。访问此内存区域将比访问其他内存区域(从.bss
等)更快。
但是对于像CreateWindow
这样的函数,每个程序只调用几次,这并不重要。差别不到几百个CPU周期。对于代码的其他部分,差异可能更加明显。但是需要注意的重要一点是,如果您对同一块数据重复执行相同的操作,那么数据也将最终进入CPU缓存,因此性能差异将被抵消。
老实说,我认为您应该把这些决定留给编译器。编写编译器的人已经花了很多人年的时间来优化代码,所以对于99%的应用程序来说,几乎没有理由担心这些事情。在1%的情况下,当你编译时,做一个程序集清单并检查代码,因为在那里你可能会获得一个或两个周期。
没有你的代码判断,我有一个建议:
过去,汇编语言是编写快速程序的好方法。但是,现在有了第三方库、复杂的算法、编译器的智能优化、可移植性问题以及cpu和内存速度的巨大改进,这种方法已经过时了。
甚至,根据我的经验,手工编写的汇编代码可能会对代码的性能产生不良影响,因为编译器不能在该汇编块中生成智能代码。
在高级语言中使用汇编代码的另一个不好的事情是阻止代码的可移植性。
注意:然而,对于某些机器和系统来说,汇编编码是很好的
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 使用全局变量与局部变量和require
- 将变量声明为全局变量,然后声明为局部变量 -Shadowing-
- 将局部变量保存到全局向量中,为什么离开局部范围后可以得到这些局部变量?
- 局部变量如何隐藏全局变量
- 编译器是否可以从全局变量中读取两次,而不是存储一个局部变量
- 我不知道如何让我的程序使用局部变量而不是全局变量
- 怎么可能有两个同名的变量——一个是全局变量,另一个是局部变量
- 递归计算在不使用静态局部变量,全局变量或静态函数的情况下,在递归函数中发生的环数
- C 中的全局和局部变量
- Arduino/C++全局变量与局部变量
- c和c++上下文中静态、自动、全局和局部变量之间的差异
- 编译器如何知道变量是全局变量还是局部变量(C)
- 当局部变量被复制到全局变量时,C++GCC优化速度会减慢
- 为什么局部变量不隐藏数组定义中的全局变量
- 全局变量和局部变量
- C++:全局变量与局部变量.使用什么
- C++-全局变量与局部变量的读/写速度
- 在 C++ 中将局部变量分配给全局变量