【问题标题】:Does removing comments improve code performance? JavaScript删除注释会提高代码性能吗? JavaScript
【发布时间】:2009-09-08 22:03:23
【问题描述】:

从 JavaScript 代码中删除 cmets 会提高性能吗?

我意识到这不是很好的编程实践,因为 cmets 是开发的内在组成部分。我只是想知道它们是否确实在编译过程中增加了一些开销。

【问题讨论】:

  • 不过,最好还是回顾一下您过去的问题。尝试找到一个正确且完整的答案并接受它。当然,如果给定问题没有好的答案,请保持原样。
  • 我会选择像 JSMin 这样的工具来缩小代码并删除所有不必要的空格。然后我会使用 gzip 或 zip 来压缩文件。您甚至可以使用相同的扩展程序来更轻松地集成到您的站点。正如下面有人提到的,保留文件的未编码版本以进行调试和修改。这将使文件大小减少约 90%,并加快浏览器的解析速度。

标签: javascript performance


【解决方案1】:

无论您是编译还是解释 JavaScript,编译器/解释器都需要查看该行,确定它是注释,然后继续(或查看该行的某个区域)。对于 Web 应用程序,还需要下载注释行。

所以是的,有一些开销。

但是,我怀疑您是否能找到一个重要的实际场景。

如果你正在编译你的代码,开销只是在编译运行期间,而不是在后续执行期间。

【讨论】:

  • 这并不完全正确,请参阅下面的答案。在某些情况下,代码大小(包括 cmets!)可能会阻止某些 VM 优化。
【解决方案2】:

删除 cmets 将使 Javascript 文件更小,更易于下载。

除此之外,它根本不会显着影响性能。

如果您担心带宽并希望使文件更小,最好的做法是通过JSMin 或类似工具将文件部署到您的生产网站之前。 (但请SURE保留原始文件)。

【讨论】:

    【解决方案3】:

    浏览器解释代码时性能滞后?没有显着差异。 但它确实增加了字节大小,这使得下载时间更长。

    但这不是省略 cmets 的理由。保持您的开发代码库注释。在发布之前使用 javascript 压缩器。

    此外,在发布期间,请尝试将整个 javascript 代码库为单个文件中的页面打包,以最大限度地减少 HTTP 请求。 HTTP 请求会带来显着的性能损失。

    【讨论】:

    • 好点,http请求。我正在拼命地加速这个使用多个 .js 文件的网站。我会记住这一点。
    • 获取 Yahoo Slow 插件和 Google 的 PageSpeed。
    【解决方案4】:

    更新

    截至 2016 年 9 月 24 日,以下答案不再准确。

    在此提交中删除了源长度启发式: https://github.com/v8/v8/commit/0702ea3000df8235c8bfcf1e99a948ba38964ee3#diff-64e6fce9a2a9948942eb00c7c1cb75f2


    令人惊讶的答案是可能

    正如 Eric 所指出的,在下载和解析方面存在开销,但这可能非常小,以至于在大多数情况下都不会引起注意。

    但是,JavaScript 性能是一头难以驯服的凶猛野兽,而且 cmets 至少还有一种其他方式可以影响性能。

    内联

    现代(截至 2016 年)JavaScript 引擎(如 V8)做了很多相当繁重的工作来确保高性能。这些引擎所做的其中一件事称为 JIT——“及时”编译。 JIT 编译包括许多复杂且有时不直观的步骤,其中之一是将适当的小函数内联到调用站点。

    内联意味着给定的代码如下:

    function doIt(a, b) {
      return (a + b) * 2;
    }
    
    function loop() {
      var x = 1, y = 1;
      var i;
      for(i = 0; i < 100; ++i) {
        x = doIt(x, y);
      }
    }
    

    编译器会做相当于转换成这段代码:

    function loop() {
      var x = 1, y = 1;
      var i;
      for(i = 0; i < 100; ++i) {
        // the doIt call is now gone, replaced with inlined code
        x = (x + y) * 2;
      }
    }
    

    JIT 编译器能够确定可以用函数体替换对doIt 的调用。这可以带来巨大的性能优势,因为它完全消除了函数调用的性能开销。

    评论

    然而,JavaScript 引擎如何选择适合内联的函数呢?有许多标准,其中之一是函数的大小。理想情况下,这将是编译函数的大小,但 V8 的优化器使用函数中人类可读代码的长度,包括 cmets

    所以,如果你在一个函数中放置了太多的 cmets,它可能会超过 V8 的任意内联函数长度阈值,并且突然之间你又要支付函数调用开销了。

    更多信息

    请查看 Julien Crouzet 的简洁帖子了解更多详情:

    https://top.fse.guru/nodejs-a-quick-optimization-advice-7353b820c92e#.uoply32op

    请注意,Julien 谈到了曲轴; V8 此后引入了 TurboFan,但源长度标准仍然存在。

    标准的完整列表在此处(非常易读)TurboFan 源代码中,其中突出显示了源长度标准:

    https://github.com/v8/v8/blob/5ff7901e24c2c6029114567de5a08ed0f1494c81/src/compiler/js-inlining-heuristic.cc#L55

    【讨论】:

      【解决方案5】:

      这对 JavaScript 的执行没有明显的影响。

      它的不同之处在于下载到客户端浏览器的 JavaScript 文件的大小。如果你有很多 cmets,它会显着增加 JavaScript 文件的大小。对于用于布局的空白字符,情况更是如此。

      通常的方法是在部署之前“缩小” .js 文件以删除 cmets 和空白字符。缩小器还可以将变量重命名为更短的名称以节省额外空间。但是,它们通常会使原始 JavaScript 对人眼不可读,因此最好确保保留未压缩文件的副本以用于开发。

      【讨论】:

        【解决方案6】:

        另一个问题是,“这段代码很垃圾,但我们必须赶上最后期限”之类的 cmets 在客户的浏览器中可能看起来不太好。

        【讨论】:

        • 不是问题的答案。
        • 我也是 :) 在某些情况下我猜是有道理的。
        【解决方案7】:

        我不确定运行时速度,但删除 cmets 会减小下载大小,这同样重要。

        您应该始终在您处理的代码中包含 cmets,并使用压缩器将它们剥离以进行部署 - YUI Compressor 是一个很好的选择。

        【讨论】:

        • 不一定要总是将它们去掉。这是时间(最终用户的下载时间)和一点带宽成本与将其引入构建/部署过程的复杂性之间的权衡。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多