Search
Calendar
    123
45678910
11121314151617
18192021222324
252627282930 
<< June 2017 >>
Sponsored links
テツ
ぷろふぃーる
お知らせ
MacIEでは、画像をクリックした際の拡大表示が正しく表示されないっぽいです。ご了承下さい・・・。
成分解析
前田商会の成分解析占い
 
カウンタ
New Entries
Recent Comment
Recent Trackback
Category
Archives
Profile
Links
mobile
qrcode
RSSATOM 無料ブログ作成サービス JUGEM
一行で IE の JavaScript を高速化する方法
IEでは JavaScript の実行速度が遅いと常日頃から感じてたが、
それを解消する方法が載っていました。

一行で IE の JavaScript を高速化する方法

■[javascript] 一行で IE の JavaScript を高速化する方法
以下の一行をすべての JavaScript の前に読み込む

/*@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 では変数はスコープの先頭で生成されるため、 document は空の変数となり undefined になってしまいます。

そこでさらに以下のようにします。

var doc = document;
eval('var document = doc');

eval で var 宣言することでスコープ途中から変数を生成することができるのです。

これで、以降の 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;i var 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(' ')));
@*/

追記2:

さらにの反響に驚愕しつつ追記><

この方法は document と書かれた部分を 5 倍以上(ループのコストを引くとたぶん 10 倍以上?)速くすることができるのですが、その数倍というのは「プロパティアクセス」と「関数呼び出し」の差です(関数呼び出しを減らしていると考えてください)。

ですので、ほとんどのウェブサイトでは効果はあまり感じられないかもしれません。

ただ、僕の作ってるものですごい効果があったので、焦ってブログに書いてしまいました。もうちょっと注意深くエントリを書くべきだったかもしれないですね><
posted by: テツ | 雑記 | 18:38 | comments(1) | - |-
スポンサーサイト
posted by: スポンサードリンク | - | 18:38 | - | - |-
はい?これIT戦記さんの転載?
| | 2008/11/15 12:13 AM |