IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

IE 重い

IE は関数呼出しが重いから致命的だ。 jQuery とかみたいに、何段も何段も関数をかましてるライブラリがかなりもっさりしてしまう。
IE では、関数呼出しと DOM プロパティのアクセスは速度的にあまり変わらない。
つまり、 DOM に効率よくアクセスするために関数を作る意味があまりない。
なので、速いコードを書きたければ不本意ではあるが関数を減らすのがいい。

IE6 用の Virtual PC のイメージを導入してみた

今までは、 IE7 と IE6 を一台の PC 上に無理矢理入れてたので

いろいろと使いにくかった。

で、無料で使える IE6 用の Virtual PC のイメージを導入してみた

↓これ
Download Internet Explorer Application Compatibility VPC Image from Official Microsoft Download Center

最初起動したら、

Internet Options に itgproxy というプロキシが設定されていて、 itgproxy というサーバが見つかりませんと言って怒られる。
でも、プロキシの設定を外せば普通に使えた

itgproxy ってなんだ?

IE でオブジェクトの配列のソートを 10 倍速くする

この記事の内容は嘘です。間違えてました。申し訳ありません。

謝罪

すみません。この記事の内容では並び替えが行われないようです。手元の環境では toString を見ていて並び替えられていたようです。指摘してくださった id:nanto_vi さんご指摘ありがとうございます。




















以下のようにプロパティ値で並び替えたいとする。

var Klass = function(order) { this.order = order };

var array = [new Klass(3), new Klass(1), ....];

array.sort(function(a, b) { return a.order - b.order });

こうすると、 10 倍近く速くなる

var Klass = function(order) { this.order = order };

Klass.prototype.valueOf = function() { return this.order };

var array = [new Klass(3), new Klass(1), ....];

array.sort();

でも、 Firefox で動かないのでこうする

var Klass = function(order) { this.order = order };

Klass.prototype.valueOf = function() { return this.order };

var array = [new Klass(3), new Klass(1), ....];

array.sort(/*@cc_on);//*/function(a, b) { return a.order - b.order });

注意点

Klass に toString があるとそっちを見てしまうので toString があったらダメ

まとめ

昔 mala さんが言っていたように IE の気持ちになれば、 IEボトルネックが分かる。



間違えてました、まだまだ IE の気持ちを分かっていなかったようです。

一行で 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');

evalvar 宣言することでスコープ途中から変数を生成することができるのです。
これで、以降の 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
mala on Twitter: "amachangのあれ、すごいブクマされてるけど10万回ループして0.5秒みたいな話だからね。試しにLDRのツリー描画部分のベンチ取ってみたけど全く速くならなかった。"

しかし、この方法は document だけに適用できる方法ではありません。ありとあらゆる DOM アクセスに対して同様のテクニック、考え方を応用することができます。応用すれば、多くのサイトで JS の高速化が出来るのではないかと思います。
そこら辺の内容はそのうち書きます。

お騒がせしました><

IEを華麗に撃墜する一行

はい! こんにちは!!!!!

今日は、偶然ブラクラ発見しちゃったから、それをお伝えしますね!

これだよ!

<script>document.createStyleSheet().addRule('html > body', 'display:block');</script>

サンプル (IEだとブラウザが固まった上にメモリ 1.5 GB くらいくっちゃうよ! 注意してね!)

IE6とかIE6のコンポーネントブラウザだと確実に落ちちゃうみたいだね!IE7は落ちないけど!

CSSStyleSheet オブジェクトに addRule で子孫セレクタをあてるとダメなかんじかな!

ちなみに display:block の箇所はどんなプロパティでも落ちるよ! なにこれ!よくわかんないけど面白いね…!

FirefoxとかOpera大好きっ子は、これをたくさんバラまいてIEのシェアをどんどん下げちゃえばいいと思うよ!!!

元ネタ

http://d.hatena.ne.jp/Hamachiya2/20070804/browser_crasher
このテンプレートは使える!
はまちちゃんありがとう><