17

还是名称较短的函数比名称较长的函数更有效?为什么或者为什么不?

我个人认为它会更有效率,但效率不足以让我们关心它,只是猜测。

4

5 回答 5

29

没有性能差异,因为这些名称在机器级别无关紧要。编译器将处理这些名称,因此它根本不会对您的程序产生影响。

函数名称可能会变成标签(这不会影响运行时性能),变量名称可能会被寄存器引用或堆栈操作替换(两者都与您使用的名称无关)。在这个级别,操作系统正在使用(并跳转到)内存地址,而不是名称。

于 2012-05-27T05:45:07.393 回答
13

较长的符号名称可能会——稍微慢一点——减慢编译速度,但符号长度对执行时间没有影响。

解释器的某些实现可能会受到符号名称长度的影响,但不是大多数现代解释器:它们通常执行“编译”步骤,将符号名称从考虑中移除,以及其他处理。

我使用了一台运行解释 BASIC的 1972 HP 台式计算机。用户手册建议使用短符号名称以提高速度并节省内存。

于 2012-05-27T05:50:09.433 回答
5

回答问题的本质:具有长名称的函数将与具有短名称的函数一样有效,除非它递归地调用自身(并且在极少数情况下如此)。

为了回答问题的精神(当然是猜测):在现代计算机上运行的绝大多数现代语言的源代码中使用长标识符的代码,即使是那些传统上被认为是“解释”的代码也不会比使用短标识符。

一般的答案,(好吧,有点人为的)例外情况更进一步:

黑,白

编译语言:在编译过程中将符号添加到符号表中。符号表的大小和复杂性会影响编译步骤的运行时间,但不会影响程序自身的运行时间。

解释语言:符号被添加到某种解释时间字典中,定位符号所需的时间通常以 O(n) 的速率变化,其中 n 是符号长度。

灰色的影子

编译语言:对于一种可能的异常,采用动态加载和自省。例如,在 *nix 上的 C 中,您可以调用该dlopen()函数来打开一个共享对象,然后调用该函数以通过 namedlsym()来定位该对象中的数据或子程序。这会导致按名称搜索对象的符号表。如果这是您程序的主要部分,那么您的程序最终可能会在对象长度方面具有 O(n) 复杂性。然而,在实践中,像这样加载对象只是为了在初始化时加载模块化单元或插件,并且查找并没有真正发生。当然,您自己的程序中符号的长度仍然不会影响运行时间。

解释性语言:绝大多数现代解释性语言都执行了一些重要的优化和标记化,因此最后,引用长标识符或短标识符可能是 100% 等效的。散列、长度限制等都简化了事情。解析更长的标识符需要额外的时间(有时在微秒内,在现代计算机上),并且取决于语言,这可能在每次程序运行时完成,但每次程序运行最多一次。除非你做很多evals,或者大量的内省,否则你不应该看到问题。即使这样,在 Python 的情况下,自省是dict基于 - 的,并且dicts 使用散列来定位键,因此运行时间随着符号的数量而不是它们的长度而增加.

但它是编译的还是解释的?你看的越多,你今天使用的纯解释语言就越少。评论中提到了 Python,但 Python 将源代码编译为字节码,并在内部通过标记而不是它们的全名来引用标识符。JavaScript 引擎做的事情非常相似,具体取决于特定的实现。甚至(大部分)八十年代的 8 位 BASIC 都执行了标记化步骤,因此程序不会以文本形式存储在内存中(这节省了内存和 CPU 周期,在 3 MHz、64 KB 的计算机上并没有大量供应) ,但以易于解释的中间形式。变量名将被放入字典中,并使用标记(通常是地址)来引用它们。列出程序将有效地取消标记以进行显示。

于 2012-05-27T14:31:52.317 回答
1

高效在什么方面?运行时使用的内存,编译时使用的内存,运行时执行的计算,编译时执行的计算,可执行文件的大小,还是其他?

更长的标识符在编译时将需要更多的计算和内存。此外,调试可执行文件包含一些符号,因此较长的标识符可能会影响调试可执行文件的大小。

在运行时计算和内存使用方面,不,标识符的长度除了前面提到的差异的间接影响之外没有影响。

于 2012-05-27T05:53:50.663 回答
1

这将取决于您所针对的平台,假设您的意思是发布二进制文件的运行时性能。

例如,在 DLL 中的 Symbian OS 函数是通过序号查找的,因此名称永远不会是二进制文件的一部分。因此答案是否定的,它并没有更有效,因为它没有任何区别,因为它从未出现在目标图像中。

于 2012-05-27T11:44:38.900 回答