次のコードでGoogleClosureCompilerの高度な最適化を使用する場合:
function add(v1, v2){
return {x: v1.x + v2.x, y: v1.y + v2.y};
}
function lengthSq(vec){
return vec.x*vec.x+vec.y*vec.y;
}
function test(v11, v12, v21, v22) {
return lengthSq(add({x:v11, y:v12},{x:v21, y:v22}));
}
window['func']=test;
私はこの不満足な結果を得ます:
window.func = function(b, c, a, d) {
b = {x:b, y:c};
a = {x:a, y:d};
a = {x:b.x + a.x, y:b.y + a.y};
return a.x * a.x + a.y * a.y
};
私が望んでいたこと:
window.func = function(a, b, c, d) {
return (a+c) * (a+c) + (b+d) * (b+d)
};
ここでの本当の問題は、関数から複数の戻り値を取得できるように、属性に値を格納する必要があることです。私の知る限り、複数の戻り値を取得する方法は他にありません。私は当初、ClosureCompilerがこれらを排除することを望んでいましたがそうではないようです。
手作業で最適化された例と同等のコードを出力できる機能指向またはオブジェクト指向のJavaScriptライブラリを使用することは可能ですか?
属性のないコードはChromeとFirefoxで約100倍、Operaで12倍、IE9で4倍高速であるため、パフォーマンステストコードに欠陥があると確信しています。
このコードのパフォーマンステスト:http://jsperf.com/closure-compiler-vs-hand-optimized-vectors