IE6 用の Virtual PC のイメージを導入してみた
今までは、 IE7 と IE6 を一台の PC 上に無理矢理入れてたので
いろいろと使いにくかった。
で、無料で使える IE6 用の Virtual PC のイメージを導入してみた
最初起動したら、
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 });
一行で IE の JavaScript を高速化する方法
以下の一行をすべての JavaScript の前に読み込む
/*@cc_on _d=document;eval('var document=_d')@*/
たとえば
以下のように、読み込む前と読み込んだ後を比較してみます。
// 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
mala on Twitter: "amachangのあれ、すごいブクマされてるけど10万回ループして0.5秒みたいな話だからね。試しにLDRのツリー描画部分のベンチ取ってみたけど全く速くならなかった。"
しかし、この方法は document だけに適用できる方法ではありません。ありとあらゆる DOM アクセスに対して同様のテクニック、考え方を応用することができます。応用すれば、多くのサイトで JS の高速化が出来るのではないかと思います。
そこら辺の内容はそのうち書きます。
お騒がせしました><
IE Crashr
new ActiveXObject('Shell.Explorer').navigate('');
IEを華麗に撃墜する一行
はい! こんにちは!!!!!
今日は、偶然ブラクラ発見しちゃったから、それをお伝えしますね!
これだよ!
<script>document.createStyleSheet().addRule('html > body', 'display:block');</script>
→ サンプル (IEだとブラウザが固まった上にメモリ 1.5 GB くらいくっちゃうよ! 注意してね!)
IE6とかIE6のコンポーネントブラウザだと確実に落ちちゃうみたいだね!IE7は落ちないけど!
CSSStyleSheet オブジェクトに addRule で子孫セレクタをあてるとダメなかんじかな!
ちなみに display:block の箇所はどんなプロパティでも落ちるよ! なにこれ!よくわかんないけど面白いね…!
元ネタ
http://d.hatena.ne.jp/Hamachiya2/20070804/browser_crasher
このテンプレートは使える!
はまちちゃんありがとう><