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

Joã*_*imo 47 javascript minify google-closure-compiler node.js uglifyjs

我很想知道,因为Clojure Compiler和UglifyJS不仅可以优化代码大小而且还可以优化性能(虽然我认为大小是主要优先级),如果我的node.js应用程序被缩小,我的运行速度会更快吗?我知道它可能取决于应用程序,但我一般都会问这个问题.

le_*_*e_m 38

缩小可以提高性能.

Node的V8优化编译器根据一些启发式内函数.缩小会影响这些启发式.这可能会导致以前未内联的函数内联.由于内联函数通常执行得更快,因此可以提高性能.

节点9.0+/V8 6.2+(Turbofan) - 性能改进较小

如果函数的未优化字节码大小小于500,则将内联.缩小通常会减少AST(抽象语法树)节点计数.由于字节码是直接从AST生成的,因此我们可以预期字节码大小会有所减少.

来源:[Turbofan]使用字节码大小进行内联启发式扫描.

Node 8.3+/V8 5.9+(Turbofan)→性能改进较小

如果函数的AST节点数小于196,则将内联.缩小通常会减少AST节点数.

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

节点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;
}
Run Code Online (Sandbox Code Playgroud)

缩小将此缩小为function f(){return 1}.

如果我们现在调用两个变体n次并比较rawminified函数的性能,我们得到以下结果:

原始与缩小的表现

显然,缩小功能的执行速度是原来的两倍多.

另请参阅:#NodeJS:快速优化建议


Nat*_*nes 29

在节点中,主要的处理成本是I/O操作,而不是实际的JavaScript本身.例如:

fs.readFile(myFile, function (err, data) {
    processTheFile(data);
});
Run Code Online (Sandbox Code Playgroud)

这里,调用readFile和被触发的回调之间的差距将比回调所花费的时间长几倍.(如果是相反的话,你可能不应该使用节点.)

因此,优化processTheFile速度功能毫无意义,因为您节省了一小部分非常小的数字.

  • Closure-compiler的原型虚拟化和函数内联(以及所有其他优化)将使代码执行得更快,但与I/O操作相比,它仍然可能是一个小的改进. (3认同)
  • 我见过的最大的胜利实际上来自崩溃属性. (2认同)

Gre*_*reg 5

不再真实了。

是的,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