- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
问题:
访问栈和访问内存的速度一样吗?
例如,我可以选择在堆栈中做一些工作,或者我可以直接在内存中标记的位置进行工作。
所以,具体来说:push ax
和 mov [bx], ax
的速度一样吗?同样,pop ax
与 mov 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/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!