我想知道,由于 Clojure Compiler 和 UglifyJS 不仅优化了代码的大小,而且还优化了性能(尽管我认为大小是主要优先事项),如果我的 node.js 应用程序被缩小,它会运行得更快吗?我知道这可能取决于应用程序,但我一般都在问这个。
4 回答
缩小可以提高性能。
Node 的 V8 优化编译器根据一些启发式内联函数。缩小会影响这些启发式方法。这可能会导致以前未内联的函数内联。由于内联函数通常执行得更快,因此可以提高性能。
###Node 9.0+ / V8 6.2+ (Turbofan) - 小的性能改进
如果函数的未优化字节码大小小于 500,它将被内联。缩小通常会减少 AST(抽象语法树)节点数。由于字节码是直接从 AST 生成的,我们可以预期字节码大小也会有所减少。
来源:[Turbofan] 使用字节码大小进行内联启发式算法。
###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 现在基于使用 TurboFan 的 v8 5.1。正如 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,它生成了一个带有一些预定义类的新应用程序。我认为在这种情况下,缩小基本代码是有意义的。因为您希望允许开发人员使用它,但不修改它(或至少让它很难做到)。这样我会推动开发人员下载新版本,而不是更新应用程序中的类。