0

Google の Closure Compiler がどのように機能するのか疑問に思っています。たとえば、次のような関数呼び出しを変換できますか。

if (MyApp.isArray(...)) {
    // foobar
}

実際の実装に:

if ((typeof sthing === 'Object' && sthing.constructor.toString().indexOf("Array") !== -1))

私はいくつかの機能を結び付ける多くのラッパーを持っているので、これを求めています.Closure Compilerにそれらを変換して、関数呼び出しを1つ少なくしたいのです.

実際、関数呼び出しを 1 つ追加すると、アプリの速度が目に見えて遅くなりますか?

4

3 に答える 3

2

Closure Compiler (Advanced モード) は、1 行の関数、または 1 回だけ呼び出される関数をインライン化します。

コンパイラの作成者にとっては明らかに、最初のケースでは、関数呼び出しを節約する方が経済的であり、通常、1 行の関数は十分に短く、関数呼び出しと同じくらいの長さです。2 番目のケースでは、関数呼び出しを回避し、より短いので、明確な勝利です。

私の知る限り、複数行または複数回呼び出されるインライン関数はありません。これは明らかにコードの肥大化を避けるためです。

長いワンライナー関数はインライン化されていないと言う人を聞いたことがありますが、インライン化されているのをいつも見てきました。

于 2011-03-10T12:08:37.867 に答える
2

実際、関数呼び出しを 1 つ追加すると、アプリの速度が目に見えて遅くなりますか?

ほとんどの場合そうではありませんが、本当に知りたい場合は、2 つの異なるコード例を試して、違いがあるかどうかを確認してください。さまざまな要因 (システム、ブラウザー、呼び出している関数など) が関係しているため、テストを行うことが重要です。プロファイリングにはFirebugをお勧めします。

于 2011-01-03T20:00:30.150 に答える
1

とにかくClosure Compilerにそれをさせることはないと思います。主な焦点はソースを縮小することであり、私が知る限り、実際に実行するのが短い場合にのみ、そのような関数呼び出しをインライン化します。

于 2011-01-03T19:02:47.293 に答える