从JavaScript代码中删除注释是否可以提高性能?
我意识到这不是很好的编程实践,因为评论构成了发展的内在组成部分。我只是想知道它们是否确实在编译期间增加了一些开销。
答案 0 :(得分:11)
无论是编译还是解释JavaScript,编译器/解释器都需要查看该行,确定它是注释,然后继续(或查看该行的某个区域)。对于Web应用程序,还需要下载注释行。
是的,有一些开销。
但是,我怀疑你能找到一个真实世界的情况,这种差异很重要。
如果您正在编译代码,则开销仅在编译运行期间,而不是在后续执行期间。
答案 1 :(得分:7)
删除评论将使Javascript文件更小,更容易下载。
除此之外,它根本不会影响表现。
如果您担心带宽并希望缩小文件,最好的办法是通过JSMin或类似工具将文件部署到生产网站。 (但 SURE 保留原始文件。)
答案 2 :(得分:3)
浏览器解释代码时性能滞后?没有显着差异。 但它确实增加了bytesize,这使得下载时间更长。
但是没有理由忽略评论。保持您的开发代码库评论。在发布之前使用javascript压缩器。
此外,在发布期间,尝试将单个文件中的页面的整个javascript代码库聚集在一起,以便最小化HTTP请求。 HTTP请求会带来严重的性能损失。
答案 3 :(得分:3)
截至2016年9月24日,以下答案不再准确。
此提交中删除了源长度启发式: https://github.com/v8/v8/commit/0702ea3000df8235c8bfcf1e99a948ba38964ee3#diff-64e6fce9a2a9948942eb00c7c1cb75f2
令人惊讶的答案是可能!
正如Eric所说,在下载和解析方面存在开销,但这可能很小,在大多数情况下都不会引起注意。
然而,JavaScript性能是一种狡猾的危险野兽,并且评论至少还有一种其他方式可以影响性能。
Modern(截至2016年)V8等JavaScript引擎在确保高性能方面做了大量相当繁重的工作。这些引擎所做的一件事就是JIT - " Just In Time"汇编。 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的优化程序使用函数中人类可读代码的长度,包括注释。
因此,如果你在函数中添加了太多注释,它可能会将它推过V8的任意内联函数长度阈值,并且突然你再次支付函数调用开销。
请查看Julien Crouzet的简洁帖子了解更多详情:
https://top.fse.guru/nodejs-a-quick-optimization-advice-7353b820c92e#.uoply32op
请注意Julien谈到Crankshaft;此后V8引入了TurboFan,但源长度标准仍然存在。
完整的标准列表在此处(非常易读)TurboFan源代码中,突出显示了源长度标准:
答案 4 :(得分:2)
这对JavaScript的执行没有明显的影响。
它的作用与下载到客户端浏览器的JavaScript文件的大小有关。如果您有大量注释,则可以显着增加JavaScript文件的大小。使用用于布局的空白字符可能更是如此。
通常的做法是在部署之前“缩小”.js文件以删除注释和空格字符。 Minifiers还可以将变量重命名为较短的名称以节省额外的空间。它们通常会使原始JavaScript对人眼不可读,因此最好确保保留未缩小文件的副本以供开发。
答案 5 :(得分:1)
另一个问题是,“此代码是废话,但我们必须在截止日期前完成”的评论可能在客户的浏览器中看起来不太好。
答案 6 :(得分:1)
我不确定运行时速度,但删除评论会减少下载量,这同样重要。
您应该始终在您使用的代码中添加注释,并使用缩小器去除它们以进行部署 - YUI Compressor是一个很好的注释。