つーか、全く速くならんかった。
昨日からはてブで賑わっている「一行でIEのJavaScriptを高速化する方法」を試したのだけど、私の環境では全く速くならんかった。記事を読んだときは、私も「これはすごい」と思って、今朝早速、最近ずっと開発していた場所に組み込んでベンチを取ってみたのだけど、全く変わらないという結果が出た。
まず、 IE では document にそのままアクセスすると window オブジェクトの内部メソッドが実行されてしまいます。これが非常に重いのです。
まぁ、確かに理解はできるし、軽くなりそうな気がするけども、実際はdocumentを呼ぶ機会は少ない(DOMで検索した要素もキャッシュ化している)ので、高速化されなかったってことかな。きっと、
この方法は document と書かれた部分を 5 倍以上(ループのコストを引くとたぶん 10 倍以上?)速くすることができるのですが、その数倍というのは「プロパティアクセス」と「関数呼び出し」の差です(関数呼び出しを減らしていると考えてください)。
ですので、ほとんどのウェブサイトでは効果はあまり感じられないかもしれません。
とのことなので、私のスクリプトが重いのはDOM検索なので、変わらなかったんだろうな。
つーか、変数の初期化に関しては、勉強になったよ。特にJavaScript高速化 – まさにっき(使えないプログラマーの記録)の「とおりすがり」氏、説明わかりやすい!というわけで、私もメモとして書かしてもらおうっと。
とおりすがり 『> これもまた、 JavaScript では変数はスコープの先頭で生成されるため、 document は空の変数となり undefined になってしまいます。
例えば var foo = 1, bar = 2; var foobar = foo + bar; なんていう宣言があった場合、
var foo = bar = foobar = undefined; //宣言された変数はスコープの最初に全部まとめて生成される。
foo = 1; bar = 2; foobar = foo + bar;
みたいに解釈されます。なので
var doc = document; var document = doc; は
var doc = document = undefined; doc = document; document = doc;
になって undefined になるんですよ。> 2行目の時点での doc が undefined になっているのか?
var document; がある時点で、そのスコープに入った瞬間に document が undefined になるわけです。
と、全然関係ない通りすがりでした。』 (2007/10/11 08:05)
あと、amachangさんの言っているevalのタイミングについても勉強になった。
eval で var 宣言することでスコープ途中から変数を生成することができるのです。
しかし、
[javascript]
/*@cc_on _d=document;eval(‘var document=_d’)@*/
[/javascript]
といった、いかにも黒魔術的な書き方はハックって感じがするね。
Shin Ohno 2003-2012