gpt4 book ai didi

push vs. mov(stack vs. near memory)的成本,以及函数调用的开销

转载 作者:太空狗 更新时间:2023-10-29 16:24:52 27 4
gpt4 key购买 nike

问题:

访问栈和访问内存的速度一样吗?

例如,我可以选择在堆栈中做一些工作,或者我可以直接在内存中标记的位置进行工作。

所以,具体来说:push axmov [bx], ax 的速度一样吗?同样,pop axmov ax, [bx] 的速度相同吗? (假设 bx 在 near 内存中有一个位置。)

提问动机:

在 C 语言中,不鼓励带有参数的琐碎函数是很常见的。

我一直认为这是因为不仅参数必须被压入堆栈,然后在函数返回时从堆栈中弹出,而且因为函数调用本身必须保留 CPU 的上下文,这意味着更多的堆栈使用.

但假设知道标题问题的答案,就可以根据直接内存的等效数量来量化函数用于设置自身(推送/弹出/保留上下文等)的开销访问。因此出现了标题问题。


( 编辑:说明:上面使用的 near 与 16 位 x86 架构的 segmented memory model 中的 far 相对。)

最佳答案

如今,您的 C 编译器可以比您更聪明。它可能会内联简单的函数,如果这样做,将不会有函数调用或返回,并且可能不会有与传递和访问正式函数参数相关的额外堆栈操作(或内联函数时的等效操作,但可用寄存器已用尽)如果一切都可以在寄存器中完成,或者更好的是,如果结果是一个常量值并且编译器可以看到并利用它。

函数调用本身在现代 CPU 上可能相对便宜(但不一定是零成本),如果它们被重复并且如果有单独的指令缓存和各种预测机制,有助于高效的代码执行。

除此之外,我希望选择“本地变量与全局变量”的性能影响取决于内存使用模式。如果 CPU 中有内存缓存,则堆栈很可能位于该缓存中,除非您在其上分配和释放大型数组或结构,或者进行深度函数调用或深度递归,从而导致缓存未命中。如果感兴趣的全局变量经常被访问或者如果它的邻居经常被访问,我希望该变量大部分时间也在缓存中。同样,如果您正在访问无法放入缓存的大容量内存,则会出现缓存未命中并可能降低性能(可能是因为可能有也可能没有更好的缓存友好方式来执行您的操作想做)。

如果硬件相当笨拙(没有缓存或缓存很小,没有预测,没有指令重新排序,没有推测执行,什么都没有),显然您想减少内存压力和函数调用次数,因为每个人都会计数。

还有一个因素是指令长度和解码。访问堆栈位置(相对于堆栈指针)的指令可能比访问给定地址处的任意内存位置的指令更短。较短的指令可能会被更快地解码和执行。

我想说对于所有情况都没有明确的答案,因为性能取决于:

  • 您的硬件
  • 你的编译器
  • 你的程序及其内存访问模式

关于push vs. mov(stack vs. near memory)的成本,以及函数调用的开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12766534/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com