【问题标题】:Does the method name length have any impact whatsoever on the performance?方法名称长度对性能有任何影响吗?
【发布时间】:2011-11-12 18:42:00
【问题描述】:

我是一名高级开发人员,所以在我看来这是一个愚蠢的问题。我的答案应该是否定的,或者什么?不!!!

但我昨天在开会,正在解释一些 PMD 结果。当我们遇到“方法名过长”的问题时,我开始解释,客户说:嗯,记住方法名过长对性能有影响,程序运行慢。

我说:不,你错了,只是一个干净的代码规则,得到一个好代码很重要,但与性能无关,字节码相似,不同名称。

但是客户,还有一些在会议上争论的人,对此很确定。他们有一些项目,方法名称过长是性能不佳的原因。

我唯一的想法是一些自省或反射的东西与此有关,但除此之外,我确信,或者我认为我是肯定的,方法名称长度对性能没有任何影响。

对此有何想法或建议?

【问题讨论】:

  • 两周前我穿了红袜子,开始下雨了。从那以后我就一直穿着蓝袜子,我们没有下过雨。这听起来可能不相关,但可能与您的客户使用的推理链相同。
  • @ivarni:你说得对,这正是最有可能发生的事情。
  • 谁声称这不知道编程语言是如何实现的,或者完全愚蠢(没有好的说法)以至于他们没有发现实现它们时最简单的潜在优化(或者,可能更糟,假设 JVM 作者是白痴)。他们似乎也无法正确验证他们的假设。
  • @delnan:这也是我的第一个想法,但后来我退后一步,认为 Java 可能只是具有某种独特的设计功能,而 OP 的情况可能只是事实证明是合理的:-)
  • @KerrekSB:这样的事情将是极其模糊的极端情况,如果它们会对性能产生影响,那么有人会进行优化以在不需要时消除这种影响。据我所知,完全有可能在编译时为所有方法、成员和变量分配索引,我相信 java 字节码确实做到了。当然,您可以使用 O(n) 的反射信息来做事情,其中​​ n 是方法名称的长度,但我认为假设情况并非如此(尤其是考虑到一般索赔的性质)。

标签: java performance profiling pmd


【解决方案1】:

可以说它会占用更多的内存和存储空间 - 例如,包含具有 巨大 方法名称的类的 jar 文件将大于具有短类名称的 jar 文件。

但是,性能上的任何差异令人难以置信不太可能引起注意。我认为几乎确定他们将长方法名称归咎于性能不佳的项目实际上被误诊了。这不是第一次发生。

当然,消除这种情况的最佳方法是提供证据 - 如果性能很重要,您应该进行性能测试。使用长方法名运行这些测试,然后将它们重构为短方法名并重新运行测试。如果有显着差异,我会感到非常惊讶。

【讨论】:

  • 我完全同意。长方法名称对性能没有影响。
  • +1:很长的名称(和很短的名称)可能表明一种特殊的开发方法,它可能不太关心性能和最佳开发实践。例如JDK 中最长的类名似乎已经生成,并且可能不是手动优化的。
  • 你的回答让我有点困惑,我的理解是,最终一旦 Java 代码被编译,那么它就是字节码,而字节码肯定不会与开发人员保持相同的变量名称,他们将被翻译成指令等。
  • @pjj:是的,但是方法名称仍然是类文件的一部分,因此它们会增加磁盘上文件的大小以及加载这些类时所需的内存量。字节码确实维护字段的名称,而不是局部变量。您可以通过使用反射访问字段来判断这一点 - 但无论如何,这个问题是关于 method 名称的,而且它们是在字节码中维护的。
  • @JonSkeet 完美,它澄清了。也许你可以在你的答案中添加这个,对于像我这样的新手来说并不那么明显。
【解决方案2】:

方法名称不仅与反射有关,而且在类加载期间也有关,当然在这两种情况下,方法名称很长意味着在某种程度上 CPU 要做的事情更多。但是,由于方法名称的长度甚至很实用(即不是数千个字符长),我绝对可以肯定,与反射或类加载期间必须完成的其他事情相比,这不可能是重要的。

【讨论】:

    【解决方案3】:

    但是客户和会议上有些人在吵架 对此,我很确定。他们有一些项目用那种漫长的方法 名称是性能不佳的原因。

    这听起来像是一个完全的猜测被视为事实。 这只是一些人对性能的普遍疯狂的一个例子。 即使他们碰巧是对的,这完全是猜测。

    每个程序都有通过更改某些内容来提高性能的空间。 猜测不会告诉你那些东西是什么。

    如果执行相同操作的两个程序具有不同的性能,则仅表示它们已进行了不同程度的优化。 你的挑战是解释这一点。

    【讨论】:

      【解决方案4】:

      如果缩短类名和成员名,则会对启动时间产生积极影响。为此,可以使用字节码收缩器

      例如,yguard (LGPL) 可以收缩代码。它还允许您出于调试目的对堆栈跟踪进行去混淆处理。

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          我认为函数名的长度对性能的影响如下:

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

          当一个黑盒(lib 文件,app)连接到其他黑盒(lib 文件,app)时,它使用头文件中的函数名作为标识。所以我认为名称的长度会影响性能。

          【讨论】:

            猜你喜欢
            • 2011-09-13
            • 1970-01-01
            • 2021-10-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-19
            • 1970-01-01
            • 2011-08-11
            相关资源
            最近更新 更多