2010-11-28 1 views
6

クロージャコンパイラは関数をインライン展開していますが、その関数がインライン化されていない場合はコードサイズが小さくなります(コードサイズは気になります - これはJS1k用です)。私はその関数をインライン化したくないことをコンパイラに伝えることはできますか?Googleクローズコンパイラを*インラインで特定の関数にすることはできませんか?

編集:キャンバスコンテキストで

function lineTo(x,y) { 
    a.lineTo(x,y); 
} 

aだけでは少し良く説明し、ここに私の機能です。コードには非常に多くのa.lineToがあるので、この関数を使用する価値があります。このように、私のコードは1019バイトです(そしてlineToはすべてa.lineToに置き換えられています)。

function lineTo(x,y) { 
    a.lineTo(x,y); 
    console.log(); 
} 

新しい行が何らかの理由でコンパイラにこの関数をインライン化させないようにします。この関数は993バイトを与えます。だから私がconsole.log();を取り除くことができたなら、別の14バイトを節約するだろう。 the tutorialから

+1

http://code.google.com/intl/ja/closure/compiler/docs/compilatio n_levels.html "コンパイラは、インライン展開が安全であり、領域を節約すると判断した場合にのみ関数をインライン化します。" ...多分ドキュメントが間違っているか、コンパイラにバグがあります。 – timdream

+0

@timdream私の編集を参照してください。インライン展開してもサイズを大きくしても、1行の関数を自動的にインライン展開するようです。 – Skilldrick

+0

ありがとう。 – timdream

答えて

4

あなたが閉鎖コンパイラは、あなたが残しておきたい機能を削除して、これを防止するには、2つの方法があることを発見...場合:
は*あなたの関数は、によって処理されたコードを呼び出す移動クロージャコンパイラ。
*保存したいシンボルをエクスポートします。

おそらくdiscussed hereである第二の、したいが、基本的には、明示的にwindowプロパティとして設定するためにダウンしています:あなたのJS1kの提出については

function foo() { 
} 
window['foo'] = foo; 

、あなただけのオフ最後の行を残したいですそれは不要です。クロージャーはまだ関数の名前を変更しますが、シンボル名の末尾にaという名前が付けられ、そこから続行されるため、名前がと長くなることは考えにくいでしょう。

online compiler serviceで試してみることができます。あなたがこれを貼り付ける場合:

// ==ClosureCompiler== 
// @compilation_level ADVANCED_OPTIMIZATIONS 
// @output_file_name default.js 
// ==/ClosureCompiler== 

// ADD YOUR CODE HERE 
function hello(name) { 
    alert('Hello, ' + name); 
} 
hello('New user'); 

...コンパイルした結果が

alert("Hello, New user"); 

あるしかし、あなたは最後まで...

window['hello'] = hello; 

を追加した場合、コンパイル結果は次のとおりです。

function a(b){alert("Hello, "+b)}a("New user");window.hello=a; 
+0

「インライン化」と同じことを「削除」していますか? –

+0

@Robert:いいえ、デッドコードの削除を意味します。しかし、インライン展開もできません。 –

+1

そのような作品。出力に 'window.lineTo = n;'を生成するので、995バイトになります。これは不要です。 – Skilldrick

関連する問題