Googleのトップページを開くと毎秒100回JavaScriptが実行されるよ

 FirefoxがCPUを常に15%ぐらい食うのが気になっていたので調べてみたら、Googleのトップページを開くとものすごい勢いでJavaScriptが実行されることがわかった。具体的には、var k=t.value;k!=h&&X(0);h=k というコードが毎秒100回実行されている。このせいで、自分の使っているPCだと、Googleのトップページを開くだけでCPU使用率が2%ぐらい上がっているようだ。Firefox特有の問題というよりは、ウェブページ側の作り方に依るものみたいだ。たぶん他のブラウザでも問題は変わらないだろう。
 Googleのトップページの場合、コードを調べてみた限りでは、原因はどうも検索候補の自動補完用のコードみたいだ。現在の入力文字列が過去の記録と違ったら補完の提示をやり直す、みたいなことをやっているように見える。
 HTMLではテキストボックス内のテキストが変更されたらonchangeイベントハンドラが呼ばれるので、これを使えばもっと効率的な実装ができそうに見えるけれど、実際にはchangeイベントはテキストボックスの場合フォーカスが外れるまで発生しないので、うまくいかない。だから、0.01秒おきに検索ボックスの中身を確認して、変更があったら補完候補の提示をやり直す、というやり方になっているんだろう。keypressイベントとかそこら辺のイベントを組み合わせることでもうちょっと効率的な実装はできないものかと疑問にも思うが、Googleのトップページは効率面も考えて作られているだろうから、他には方法はないんだろう。(と思ったが、Yahooはこのようなポーリングを行わずに補完候補の提示を行っている。ただ、この場合、日本語で入力中の未確定文字列に関しては補完が行えない。IMEがキーイベントを全部横取りするからだろう。)
 しかし、これだけよく使われるページでほとんど無駄に毎秒100回もJavaScriptが実行されているというのは、なんか残念な現実だ。とりあえず、今度実家に帰ったら、実家PCのブラウザホームページをGoogleから別のなにかに変えておこうと思った。
 他にもいくつか頻繁にJavaScriptを実行してしまうサイトを見つけたので、以下、それらについて書いておく。
 まず、多くの人に影響がありそうなサイトでは、Amazonがそうだ。Amazonはサイト内のほとんどのページに検索ボックスが表示されており、それらがすべてGoogleのトップページと同様、検索ボックスでの補完用に毎秒かなりの回数のJavaScriptを実行している。頻度は毎秒50回に設定されているようだ。
 また、Amazonの他にメジャーなサイトでは、YouTubeのページも検索ボックスの補完候補用にかなり頻繁にJavaScriptを呼んでいる。Googleに買収されているので、Googleと似たような仕組みを使っているのだろう。Googleはトップページだけだが,YouTubeは検索結果のページや動画の再生ページでも検索補完を行うため、どのページを表示していても無駄にCPUを使ってしまう。
 読売新聞のYOMIURI ONLINEのトップページも、毎秒10回ぐらいJavaScriptが呼び出されている。これはどこら辺が実行されているのかを特定することに失敗した。(というか、だんだん真剣にソースを読むのがめんどうになってきた…)
 Microsoft検索エンジンであるBingのトップページも、毎秒1回程度JavaScriptを呼び出している。これもよくわからないが、 (new Image).src = m + k + e + a("]"); というコードを見る限りでは、ユーザがそのページを開いたままであるということをサーバ側に送っている、つまり滞在時間の計測に使われているんじゃないかと思う。
 次に、これを読んでる半分以上の人は関係なさそうなページだが、IEEEのページもかなり重たい。トップページに(http://www.ieee.org/)にアクセスすると http://www.ieee.org/portal/cms_docs/iportals/global/js/milonic_src.js がものすごい勢いで呼ばれる。呼ばれる間隔はどれぐらいかよくわからかったが、最低でも毎秒数回は確実に呼ばれている。さらに、論文を探すためにIEEE Xplore(http://ieeexplore.ieee.org/)にアクセスすると、こちらも http://ieeexplore.ieee.org/styles/ieee_menubar/activemenu.js の61行目が毎秒10回呼ばれている。個別の論文のページでも、同様に毎秒10回JavaScriptが呼ばれている。
 あと、これはページではないが、Firefoxの拡張で情報化タブをインストールすると、サムネイルのアップデートのために、かなり頻繁にJavaScriptが呼ばれるようだ。レンダリングの完了を通知するイベントがFirefoxにあるとは思えないのでこれも仕方なさそうだが、CPU使用率に影響するみたいだ。
 以上の点に気をつけると、CPU使用率が15%から2%まで下がった。2%ならばまぁ許容範囲といえるんじゃないかな。
 まとめると、

  • Googleのトップページは開いているだけでCPUを使うので、用事がないときは開かないようにしよう。
  • AmazonYouTubeIEEEなども同様に、開いているだけでCPUを使うので、用事がないときは開かないようにしよう。
  • YOMIURI ONLINEとBing(のトップページ)にもすこし気をつけよう。

 という感じか。
 おまけでどうやってこれを見つけたかと書いとくと、適当で恥ずかしいのだが、以下のようなパッチを当てたFirefoxをビルドして、全部のタブを一つ一つ閉じていって、出力が明らかに減るページだけちょっと詳しくソースを読んだ。でも、ブラウザに詳しい人なら、たぶんこんな変なことをしなくても、JavaScriptをサクサクと書くだけで格好良くみつけられるだろうと思う。
 パッチ:http://kodou.net/~tkng/mozilla-when-javascript-executed.diff
 追記:ブラウザやOSでかなりCPU使用率に差が出るみたいだ。詳しくはこちら:Googleのトップページを開いた時の各ブラウザでのCPU使用率