我很想知道,因为Clojure Compiler和UglifyJS不仅优化了代码的大小而且还优化了性能(虽然我认为大小是主要优先级),如果它缩小了,我的node.js应用程序会运行得更快吗?我知道这可能取决于应用程序,但我一般都会问这个问题。
答案 0 :(得分:34)
缩小可以提高效果。
Node的V8优化编译器inlines根据一些启发式方法运行。缩小会影响这些启发式。这可能会导致以前未内联的函数内联。由于内联函数通常执行速度更快,因此可以提高性能。
如果函数的未优化字节码大小小于500,则将内联。缩小通常会减少AST(抽象语法树)节点计数。由于字节码是直接从AST生成的,因此我们可以预期字节码大小会有所减少。
来源:[Turbofan] Use bytecode size for inlining heuristics.
如果函数的AST节点数小于196,则将内联。缩小通常会减少AST节点数。
来源:[turbofan] Don't take into account source size for inlining heuristics.
如果函数的字符数 - 包括空格和注释 - 为less than 600,则会内联。
我们假设我们的函数长度超过600个字符:
function f() {
// A long comment... bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
return 1;
}
缩小将此缩小为function f(){return 1}
。
如果我们现在调用这两个变体n次并比较 raw 和 minified 函数的性能,我们得到以下结果:
显然,缩小功能可以快速执行两次以上。
答案 1 :(得分:28)
在节点中,主要的处理成本是I / O操作,而不是实际的JavaScript本身。例如:
fs.readFile(myFile, function (err, data) {
processTheFile(data);
});
这里,调用readFile
和被触发的回调之间的差距将比回调所花费的时间长几倍。 (如果是相反的,你可能不应该使用节点。)
因此,优化processTheFile
函数的速度是没有意义的,因为你节省了一小部分非常小的数字。
答案 2 :(得分:2)
答案 3 :(得分:2)
不再是真的。
是的,Node6现在基于v8 5.1,它使用TurboFan。作为v8团队 陈述(https://bugs.chromium.org/p/v8/issues/detail?id=3354)他们 删除内联的字符数触发器。
https://medium.com/@c2c/yes-node6-is-now-based-on-v8-5-1-7a645eb9992b https://bugs.chromium.org/p/v8/issues/detail?id=3354
答案 4 :(得分:0)
我创建了一个nodejs cli,它使用一些预定义的类生成了一个新应用。我认为在这种情况下,最小化基本代码是有意义的。因为您想允许开发人员使用它,但不能修改它(或至少使其很难执行)。这样,我将推动开发人员下载新版本,而不更新应用程序中的类。