嵌套会影响效率吗?

Posted

技术标签:

【中文标题】嵌套会影响效率吗?【英文标题】:Does nesting affect efficiency? 【发布时间】:2010-07-26 18:37:44 【问题描述】:

考虑像 Python 或 javascript 这样允许函数嵌套的语言:

print(vector(a * b),(a * c),(b * c)))

或者像这样的扁平化:

i = (a * b)
j = (a * c)
k = (b * c)
V = vector(i,j,k)
print(V)

不同的格式对性能有多大影响?是否可以做出有效的概括,还是因语言而异?

我希望优化编译器会进行内联并为两者输出大致相同的机器代码。那么也许这只是解释语言的一个问题?

【问题讨论】:

是什么让您认为嵌套效果器的性能? 你说的是函数调用的嵌套,还是函数定义的嵌套?例如。 (+ (* (- 1 2) 3) 4) function() outer function inner() alert('hi'); 可读性受到威胁吗? 向我们展示您关心的代码示例会对您有所帮助。 @PeterK:老实说,我没有意识到这对人们来说是一个激励因素。感谢您指出了这一点。 :-) 【参考方案1】:

与内联存在的相同代码或将函数视为内联的编译相比,任何函数调用都会添加少量机器指令,包括更多参数以获取更多参数。

但是,它是非常少的机器指令。因此,在大多数情况下,您可以通过选择和实施更高效的算法轻松地通过任何非平凡的输入来恢复。

如果您真的处于性能的前沿(很有可能不是,除非您正在处理设备驱动程序)然后您可以开始内联函数或切换到汇编。

但无论如何,请先编写尽可能清晰的代码,然后在开始担心性能之前进行测量。这样做可以减少错误,从而有更多时间优化正确工作的代码。

编辑:如果您指的是匿名函数之类的东西,它们会导致性能下降,但与往常一样,首先测量,然后优化。

【讨论】:

...如果您处于性能的前沿,您可能对这个问题有足够的了解,而不必一开始就问这个问题。跨度> 函数调用次数有何不同? @Bryan Oakley。刚接触前沿技术的人对这个问题了解不够 - 因此他们会提出问题。 @Rainer 不是函数调用的数量,而是机器指令的数量。每个参数意味着 CPU 中的另一个“压栈”指令。它很容易通过其他优化来克服,因为它处于如此低的水平。我会更新我的答案以使这一点更清楚。 每次对变量赋值并将其移动到下一次调用通常也是一些指令。【参考方案2】:

在我见过的 Pascal 实现中,允许嵌套函数访问外部函数范围内的变量,编译器必须为每个嵌套级别维护一个额外的帧指针,并在嵌套函数访问时取消引用它来自外部范围的东西。我唯一期望这将是一个问题是嵌套函数是否在紧密循环中使用了外部函数的变量。在这种情况下,额外的取消引用操作可能会损害性能;将变量复制到循环外部的内部范围将避免额外的开销。

【讨论】:

以上是关于嵌套会影响效率吗?的主要内容,如果未能解决你的问题,请参考以下文章

嵌套递归调用 - 这是尾递归吗?

嵌套选择器性能影响和 LESS

quartus ii中case语句里能再嵌套case吗?

为啥更改 dict2 内的嵌套 dict 会影响 dict1? [复制]

第 50 题:为什么 for 循环嵌套顺序会影响性能?

嵌套结构如何影响 DocumentDB 查询性能?