加速IEのJavascript document出力の方法
2637 ワード
下記のコードをJavaScriptの先頭に追加します.
下記は加入前と加入後のテスト比較コードです.
解説:
まず、IEの中でdocumentはこのまま呼び出されると、windowオブジェクトの内部関数として実行されますが、これは比較的効果がありません.この点によって、以下の処理は速度を上げることができます.
var doc=document;
document//遅い
doc;//これは上のより速いです.
上記のように直接使うことができますが、以前はdocumentを使っていたところを全部入れ替えます.これはちょっと面倒くさいです.だから、下を見てください.
var doc=document;
var document=doc;
叶うといいですね.
JavaScriptを知っている人は、JavaScriptの変数は最初から作られていますので、ここのdocumentはundefinedになりました.
大丈夫です.引き続き改善します.
var doc=document;
eval('var document=doc')
evalの役割は、スコープ内で変数を変えることです.そうすると、後のdocumentは正常に使用されます.
最後に、IE内でのみ有効な条件を加えて、次のようにすればいいです.
この言い方は間違っています.
なぜあなたのテストの前後に違いがあるのですか?
あなたのコードはglobal実行環境です.だからIEはglobalオブジェクトでkeyが'document'のメンバーを探しに行きます.このオブジェクトはieの中でcom+実現の宿主オブジェクトです.彼はglobalの中にいません.globalの中にないなら、windowの中で再度検索します.速度が遅くなりました.
同じグローバルオブジェクトMath.はこの問題をもたらしません.原因はMathはGlobalにあります.一回の作用でドメインチェーンを調べたら見つけられます.
最適化について.一つの提案は
var win=window、doc=document、undefined;
このメンバーが二回以上使ったら意味があります.
グローバルスコープでのみie条件の注釈を使用すれば、まずie以外では機能領域が短縮されるメリットを享受できません.もちろん、ie以外ではglobal->windowのマルチ責任チェーンが存在しません.
ここの最適化の核心は、作用ドメインチェーンを短縮することです.opera chrome safaraiなどの比較的新しいバージョンが、作用ドメインチェーンの検索に最適化されました.しかし、私達が考えているのは、作用ドメインチェーンの短縮です.古いブラウザに積極的な役割を果たしています.また、最適化されたブラウザを備えています.
/*@cc_on _d=document;eval('var document=_d')@*/
このような行のコードIEを加えると、documentのアクセス速度は少なくとも5倍以上になります.下記は加入前と加入後のテスト比較コードです.
// Before
var date = new Date;
for (var i = 0; i < 100000; i++) document;
alert(new Date - date); // 643
/*@cc_on _d=document;eval('var document=_d')@*/
// After
date = new Date;
for (var i = 0; i < 100000; i++) document;
alert(new Date - date); // 145
速度がずいぶん上がったでしょう.解説:
まず、IEの中でdocumentはこのまま呼び出されると、windowオブジェクトの内部関数として実行されますが、これは比較的効果がありません.この点によって、以下の処理は速度を上げることができます.
var doc=document;
document//遅い
doc;//これは上のより速いです.
上記のように直接使うことができますが、以前はdocumentを使っていたところを全部入れ替えます.これはちょっと面倒くさいです.だから、下を見てください.
var doc=document;
var document=doc;
叶うといいですね.
JavaScriptを知っている人は、JavaScriptの変数は最初から作られていますので、ここのdocumentはundefinedになりました.
大丈夫です.引き続き改善します.
var doc=document;
eval('var document=doc')
evalの役割は、スコープ内で変数を変えることです.そうすると、後のdocumentは正常に使用されます.
最後に、IE内でのみ有効な条件を加えて、次のようにすればいいです.
/*@cc_on
var doc = document;
eval('var document = doc');
@*/
上記のように、document以外のグローバル変数も、上記の方法で加速させることができます.
/*@cc_on
eval((function(props) {
var code = [];
for (var i = 0 l = props.length;ivar prop = props[i];
window['_'+prop]=window[prop];
code.push(prop+'=_'+prop)
}
return ‘var ‘+code.join(',');
})('document self top parent alert setInterval clearInterval
setTimeout clearTimeout'.split(' ‘)));
@*/
以下はFrankkyの返事です.まず、IEの中でdocumentがこのまま呼び出されると、windowオブジェクトの内部関数が実行されます.これは比較的効果がありません.この点によって、以下の処理は速度を上げることができます.この言い方は間違っています.
なぜあなたのテストの前後に違いがあるのですか?
あなたのコードはglobal実行環境です.だからIEはglobalオブジェクトでkeyが'document'のメンバーを探しに行きます.このオブジェクトはieの中でcom+実現の宿主オブジェクトです.彼はglobalの中にいません.globalの中にないなら、windowの中で再度検索します.速度が遅くなりました.
同じグローバルオブジェクトMath.はこの問題をもたらしません.原因はMathはGlobalにあります.一回の作用でドメインチェーンを調べたら見つけられます.
最適化について.一つの提案は
var win=window、doc=document、undefined;
このメンバーが二回以上使ったら意味があります.
グローバルスコープでのみie条件の注釈を使用すれば、まずie以外では機能領域が短縮されるメリットを享受できません.もちろん、ie以外ではglobal->windowのマルチ責任チェーンが存在しません.
ここの最適化の核心は、作用ドメインチェーンを短縮することです.opera chrome safaraiなどの比較的新しいバージョンが、作用ドメインチェーンの検索に最適化されました.しかし、私達が考えているのは、作用ドメインチェーンの短縮です.古いブラウザに積極的な役割を果たしています.また、最適化されたブラウザを備えています.