方法名称长度是否会对性能产生任何影响?

12

我是一名资深开发者,所以这对我来说是一个愚蠢的问题。我的答案应该是否定的,或者说什么?绝对不会有任何影响!!!

但是昨天我在开会时,我正在解释一些PMD结果。当我们谈到“方法名过长”问题时,我开始解释,客户表示:好吧,记住,方法名过长会影响性能,程序运行得更慢。

我说:不,你错了,这只是代码规范而已,重要的是编写好的代码,与性能无关,字节码相似但命名不同。

但是客户和会议中的一些人围绕这个问题争论。他们有一些项目,其中长方法名是性能不佳的原因。

我唯一的想法是某些内省或反射机制与此相关,但除此之外,我确信,或者我认为我确信,方法名长度不会对性能产生任何影响。

对此有什么想法或建议吗?


7
两周前我穿了红袜子,然后就开始下雨了。从那时起,我就一直穿蓝袜子,我们就一直没有下雨。这听起来可能不相关,但这可能是你的客户所采用的同样推理链。 - ivarni
@ivarni:你说得对,那很可能就是发生的事情。 - Michael Borgwardt
声称这种说法的人根本不了解编程语言的实现方式,或者是如此愚蠢(没有更好的说法了),以至于他们无法发现在实现它们时最简单的潜在优化(或者更糟糕的是,认为JVM的作者是白痴)。他们似乎也无法正确验证自己的假设。 - user395760
@delnan:这也是我的第一反应,但后来我退后一步想,Java 可能具有某种独特的设计特性,使得OP的情况可能是可行的 :-) - Kerrek SB
@KerrekSB:这些情况都是极其偏僻的角落案例,如果它们会影响性能,那么当不需要时,有人会想出一种优化来抵消这种影响。据我所知,完全可以在编译时为所有方法、成员和变量分配索引,我相信Java字节码实际上就是这样做的。当然,你可以使用反射信息执行O(n)操作,其中n是方法名称的长度,但我认为可以安全地假设这不是情况(特别是考虑到声明的一般性质)。 - user395760
谢谢。他们非常确定,虽然我知道他们错了,但我开始怀疑。如果...但是我知道这是一个愚蠢的问题...再次感谢。 - ERNESTO ARROYO RON
6个回答

21

可以说,使用具有极长方法名的类的JAR文件将在内存和存储空间上占用更多空间,因此相比短类名的JAR文件要大。

然而,性能上的任何差别都 极其 不太可能被注意到。我认为几乎可以确定,那些把长方法名归咎于性能差的项目实际上是误诊。这不会是第一次发生这种情况。

当然,降低这种情况的最好方法是提供证据——如果性能很重要,应该进行性能测试。使用具有长方法名的代码运行这些测试,然后将其重构为短方法名并重新运行测试。我会非常惊讶如果有显著的差异。


1
我完全同意。方法名的长度对性能没有影响。 - user330315
+1:非常长的名称(以及非常短的名称)可能表明一种特殊的开发方法,可能并不太关注性能和最佳开发实践。例如,JDK中最长的类名似乎是自动生成的,可能没有经过手动优化。 - Peter Lawrey
1
我有点困惑你的回答,我的理解是一旦Java代码编译完成后,它将成为字节码,而字节码肯定不会保留开发人员使用的变量名称,它们将被翻译成指令等。 - pjj
2
@pjj:是的,但方法名称仍将成为类文件的一部分,因此它们会增加磁盘上文件的大小以及加载这些类所需的内存量。字节码确实维护字段的名称,只是不维护局部变量。您可以通过反射访问字段来了解这一点-但是这个问题实际上是关于方法名称的,而且再次强调,它们在字节码中得到维护。 - Jon Skeet
@JonSkeet 很好,这解释得很清楚。也许你可以把这个加到你的回答中,对于像我这样的新手来说并不那么明显。 - pjj

4

方法名不仅在反射中很重要,在类加载中也很重要,当然,在这两种情况下,如果方法名过长,则意味着CPU需要执行更多的操作。但是,对于实际可行的方法名长度(即不超过数千个字符的长度),我非常确定与反射或类加载期间必须执行的其他任务相比,这是不可能产生显著影响的。


1
但是客户以及会议中的一些人坚信这一点,并且认为长方法名是性能不佳的原因。听起来像是将猜测当作事实来对待。这只是一些人对性能的普遍疯狂想法。即使他们碰巧是对的,这也只是一个猜测。通过更改某些内容,每个程序都有提高性能的空间。猜测并不能告诉您这些内容是什么。如果两个执行相同任务的程序具有不同的性能,那只意味着它们已经被优化到不同的程度。您的挑战是解释这一点。

1

如果缩短类名和成员名称,启动时间将受到积极影响。为此,可以使用字节码缩小器

例如,yguard(LGPL)可以缩小代码。它还允许您解密堆栈跟踪以进行调试。

出于性能原因手动分配短类名和成员名称当然是一个可怕的想法。


0

我认为函数名的长度会影响性能,具体如下:

  1. 从字节码到二进制代码的编译时间(使用 Java、.Net 等),字节码仍然包含文件名、类名和包名。
  2. 如果我们使用 *.lib、*.dll、*.so,在某些情况下可能会影响性能(例如在 Android 中使用本机代码)。
  3. 当我们使用本机代码调用 Java 函数时(在 Java、Android 中)。

当黑盒子(lib 文件、应用程序)连接到其他黑盒子(lib 文件、应用程序)时,它使用标头文件中的函数名作为标识。因此,我认为名称的长度会影响性能。


0

我不明白为什么会对性能有明显影响,除非您通过反射自己获取方法名称并在 UI 上呈现它们。很明显这不是这种情况。所以我很困惑。您确定您的客户没有混淆方法名称和文件名称,或者他是否考虑到一些非常古老的编程语言不支持超长的方法名称?根据这个人的年龄,他们的判断肯定对于计算机科学家来说是荒谬的。如果他们能够用事实证明自己的观点,他们可能就应该将其提交给ACM、Oracle/Sun或MIT来验证他们的发现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接