我想知道,由于 Clojure Compiler 和 UglifyJS 不仅优化了代码的大小,还优化了性能(虽然我认为大小是主要优先事项),如果我的 node.js 应用程序被缩小,它会运行得更快吗?我知道这可能取决于应用程序,但我一般会问这个。
缩小 NodeJS 中使用的代码有意义吗?
缩小可以提高性能。
Node 的 V8 优化编译器根据一些启发式方法内联函数。缩小会影响这些启发式方法。这可能导致内联以前未内联的函数。由于内联函数通常执行得更快,因此这可以提高性能。
###Node 9.0+ / V8 6.2+ (Turbofan) - 轻微的性能改进
如果函数的未优化字节码大小小于 500,它将被内联。缩小通常会减少 AST(抽象语法树)节点数。由于字节码是直接从 AST 生成的,我们也可以预期字节码的大小会有所减少。
###Node 8.3+ / V8 5.9+ (Turbofan) → 轻微的性能改进
如果函数的 AST 节点数小于 196,它将被内联。缩小通常会减少 AST 节点数。
###Node 8.2 及之前 / V8 5.8(曲轴)及之前 → 主要性能改进
如果函数的字符数 - 包括空格和注释 -小于 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 次并比较原始函数和缩小函数的性能,我们会得到以下结果:
显然,缩小后的函数执行速度是原来的两倍多。
在 node 中,主要的处理成本是 I/O 操作,而不是实际的 JavaScript 本身。例如:
fs.readFile(myFile, function (err, data) {
processTheFile(data);
});
在这里,调用readFile
和回调被触发之间的差距将比回调所花费的时间长几倍。(如果反过来,您可能不应该使用节点。)
因此优化processTheFile
速度函数是没有意义的,因为您节省了非常小的数字的一小部分。
不再是真的。
是的,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
我创建了一个 nodejs cli,它生成了一个带有一些预定义类的新应用程序。我认为在这种情况下,缩小基本代码是有意义的。因为你想让开发者使用它,而不是修改它(或者至少让它很难做到)。通过这种方式,我将推动开发人员下载新版本,而不是更新应用程序中的类。