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

时间:2011-10-15 20:48:54

标签: c++ winapi masm

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

Devjeet

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

老实说,我认为你应该把这样的决定留给编译器。编写编译器的人花了很多人年来优化代码,因此99%的应用程序都没有理由担心这些问题。在1%的情况下,当你编译时,做一个汇编列表并检查代码,因为你可以获得一两个循环。

答案 2 :(得分:2)

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

有些日子,汇编编码是编写快速程序的好方法。但是,现在有了第三方库,复杂算法,编译器中的智能优化,可移植性问题以及CPU和内存速度的巨大改进,这种方法正在逐渐消失。

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

使用高级语言进行汇编编码的另一个坏处是阻止了代码的可移植性。

注意:然而,有些机器和系统按汇编编码对他们有好处。

相关问题