2007-10-10
一行で 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<l;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 倍以上?)速くすることができるのですが、その数倍というのは「プロパティアクセス」と「関数呼び出し」の差です(関数呼び出しを減らしていると考えてください)。
ですので、ほとんどのウェブサイトでは効果はあまり感じられないかもしれません。
ただ、僕の作ってるものですごい効果があったので、焦ってブログに書いてしまいました。もうちょっと注意深くエントリを書くべきだったかもしれないですね><
参照:
一行で IE の JavaScript を高速化する方法 - #生存戦略 、それは - subtech
Twitter / mala: amachangのあれ、すごいブクマされてるけど10 ...
しかし、この方法は document だけに適用できる方法ではありません。ありとあらゆる DOM アクセスに対して同様のテクニック、考え方を応用することができます。応用すれば、多くのサイトで JS の高速化が出来るのではないかと思います。
そこら辺の内容はそのうち書きます。
お騒がせしました><
- WEB開発日記 - IT戦記 - 一行で IE の JavaScript を高速化する方法
- PBD - 虹色センチメンタル - 一行で IE の JavaScript を高速化する...
- 東 京 ピ ク ト リ ウ ム - IT戦記 - 一行で IE の JavaScri...
- 速報ダム日和 - これはすごい
- まさにっき(使えないプログラマーの記録) - JavaScript高速化
- [Django][Python][jQuery][その他]巡回
- Surprise by Technology - 一行で IE の JavaScript を高速化する...
- var document = window.document;でも動く予感
- [Web]1行の追記でIE上のJavaScript高速化ができるらしい
- @cc_on ってなに?
- hoshikuzu | star_dust の書斎 - 神
- Overlasting::Hatena - 一行で IE の JavaScript を高速化する方法
- ほげげの戯言 - 一行で IE の JavaScript を高速化する方法
- IE の JavaScript 高速化(参照回数が多い場合)
- キタよこれ
- ryuzi_kambe の?D - いろんなソーシャルブックマークのコメントペ...
- ryuzi_kambe の?D
- http://owen-tudor.cocolog-nifty.com/blog/2007/10/post_ee80.html
- Webアプリを作ろう
- 管理人 気になる情報、ニュース
- プラズマコイの[hatena]
- [javascript]一行で IE の JavaScript を高速化する方法 - IT戦記
- IE のjavascript動作を高速化する画期的な方法
- Ci.nsIZIGOROu - [JavaScript][Behavior][HTC] XML版HTCを書くため...
- ある二宮ひかるファンの日記
- たった1行でJScriptを高速化!!
- くらげのChangeLog - IT戦記 - 一行で IE の JavaScript を高速化す...
- 三日坊主と呼ばせない!日記 - IEのJavascript高速化
- ネットランダム - あの人気記事をMMLで
- using Misuzilla.Subtech; - Internet ExplorerのDocumentプロパテ...
- 文殊堂 - Re:一行で IE の JavaScript を高速化する方法
- 院日誌 - [http://d.hatena.ne.jp/amachang/20071010/1192012056]
- たった一行で IE の JavaScript を高速化する方法
- たった一行で IE の JavaScript を高速化する方法
- JScriptの@cc_onを使ってみよう
- mr2の日記 - JavaScript 第5版の読み始め - その2
- 東京☆でぃすこ - 一行で IE の JavaScript を高速化する方法
- Haruka1976の日記
- Ci.nsIZIGOROu - [IE][WSH][COM] WebBrowser Control, MSHTMLのイベ...
- 燈明日記 - 一行で IE の JavaScript を高速化する方法
- JavaScriptの高速化
- 山本大@クロノスの日記 - IEのamachang技を使ってDOM操作のパフォ...
- 山本大@クロノスの日記 - IEのamachang技を使ってDOM操作のパフォ...
- Tech・Ed 2008 Yokohama ライトニングトークのフォローアップ
- サイScripterの旅立ち - Googleブラウザ「Chrome」を使ってみた
- uupaaの開発日記 - JavaScript の高速化その2 「全てを疑い、自分...
- 生涯一マークアップエンジニアだっ!! - javascript高速化中
- IEのJavascriptを5倍高速化するcode
- 19790401173.4 - はてなブックマークの歴代ホッテントリ
- kaisehのブログ - TopHatenar部門別トップユーザー一覧・第2版
- kaisehのブログ - TopHatenar部門別トップユーザー一覧・第2版
- DotNetNukeを高速化する方法
- 一行で IE の JavaScript を高速化する方法
- uupaaの開発日記 - amachang の 「一行で IE の JavaScript を高速...
- rand's - 2行でJavaScriptを高速化する方法
- takashisaitouの日記 - このK係長
- Cyokodog::Memo - IE の JS 高速化
- IEでJavaScript高速化!!
- なにする?DTP+WEB - スクリプトを高速化させるためのコツ
- 1715 http://www.hatena.ne.jp/
- 1699 http://b.hatena.ne.jp/
- 1492 http://www6.ocn.ne.jp/~katoyuu/
- 1285 http://egone.org/
- 1001 http://b.hatena.ne.jp/hotentry
- 799 http://d.hatena.ne.jp/
- 759 http://reader.livedoor.com/reader/
- 605 http://secure.ddo.jp/~kaku/tdiary/
- 417 http://www.ujiarmy.net/
- 329 http://www.pluto.dti.ne.jp/~rinou/
