web-dev-qa-db-ja.com

NodeJSで使用されるコードを縮小することは意味がありますか?

Clojure CompilerとUglifyJSは、サイズだけでなくパフォーマンスも最適化しているため(サイズが最優先だと思いますが)、縮小すると、node.jsアプリの実行が速くなるのではないかと思いました。私はそれがアプリに依存しているかもしれないことを知っていますが、私はこれを一般的に尋ねています。

50

ノードでは、主な処理コストはI/O操作であり、実際のJavaScript自体ではありません。だから例えば:

fs.readFile(myFile, function (err, data) {
    processTheFile(data);
});

ここで、readFileを呼び出すことと、発生するコールバックとのギャップは、コールバックにかかる時間よりも数倍長くなります。 (逆の場合は、おそらくnodeを使用すべきではありません。)

したがって、非常に小さい数の小さいパーセンテージを保存しているので、速度のためにprocessTheFile関数を最適化しても意味がありません。

29
Nathan MacInnes

縮小化できるパフォーマンスが向上します。

NodeのV8最適化コンパイラ inlines いくつかのヒューリスティックによる関数。縮小はこれらのヒューリスティックに影響を与えます。これにより、以前はインライン化されなかった関数がインライン化される可能性があります。インライン化された関数は一般的に高速に実行されるため、これによりパフォーマンスが向上する可能性があります。

Node 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;
}
_

縮小化はこれをfunction f(){return 1}に減らします。

ここで両方のバリアントをn回呼び出し、raw関数とminified関数のパフォーマンスを比較すると、次の結果が得られます。

Raw vs minified performance

明らかに、縮小された関数は2回以上の速度で実行されます。

参照: #NodeJS:簡単な最適化のアドバイス

37
le_m

もはや本当ではない。

はい、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-7a645eb9992bhttps://bugs.chromium.org/p/v8/issues/detail?id = 3354

3
Greg

次の2つのリンクに基づいて、それは非常に理にかなっています。

簡単な最適化のアドバイス

2017年2月3日にテスト実行

2
Manuel K.

いくつかの事前定義されたクラスで新しいアプリを生成するnodejs cliを作成しました。この場合、ベースコードを縮小することは理にかなっていると思います。開発者がそれを使用できるようにしたいが、それを変更したくない(または少なくとも実行を非常に難しくする)ため。この方法では、アプリ内のクラスを更新せずに、新しいバージョンをダウンロードするよう開発者に要求します。

0
Kat Lim Ruiz