缩小 NodeJS 中使用的代码有意义吗?

IT技术 javascript node.js minify google-closure-compiler uglifyjs
2021-03-07 22:05:53

我想知道,由于 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 节点数。

来源:[turbofan] 不要考虑内联启发式的源大小。

###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速度函数是没有意义的,因为您节省了非常小的数字的一小部分。

Closure-compiler 的原型去虚拟化和函数内联(以及所有其他优化)将导致代码执行得更快,但与 I/O 操作相比,它仍然可能是一个小的改进。
2021-04-24 22:05:53
让我直截了当地回答这个问题。我使用 express.js 和 gulp 来缩小我的 webapp 资产,我意识到 app.js 不是资产,而是服务器。我也打算丑化它(app.js)并推送到www/节点 http 托管的构建目录中,但我认为这篇文章说明节点 js 服务器文件不需要压缩,这意味着我不应该运行虽然吞下丑陋的推到 www/ 那么对吗?我可以在 root 中 lint 它,并且只有客户端的东西被推送到构建目录?很高兴将服务器放在 www/ 托管目录之外,反正我喜欢这样。
2021-05-10 22:05:53
是的,这是正确的。在 www 之外拥有服务器不仅“很好”,而且是安全最佳实践。
2021-05-13 22:05:53
我见过的最大的胜利实际上来自折叠属性。
2021-05-14 22:05:53

不再是真的。

是的,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,它生成了一个带有一些预定义类的新应用程序。我认为在这种情况下,缩小基本代码是有意义的。因为你想让开发者使用它,而不是修改它(或者至少让它很难做到)。通过这种方式,我将推动开发人员下载新版本,而不是更新应用程序中的类。