2009-09-30
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を使うので、用事がないときは開かないようにしよう。
- Amazon、YouTube、IEEEなども同様に、開いているだけでCPUを使うので、用事がないときは開かないようにしよう。
- YOMIURI ONLINEとBing(のトップページ)にもすこし気をつけよう。
という感じか。
おまけでどうやってこれを見つけたかと書いとくと、適当で恥ずかしいのだが、以下のようなパッチを当てたFirefoxをビルドして、全部のタブを一つ一つ閉じていって、出力が明らかに減るページだけちょっと詳しくソースを読んだ。でも、ブラウザに詳しい人なら、たぶんこんな変なことをしなくても、JavaScriptをサクサクと書くだけで格好良くみつけられるだろうと思う。
パッチ:http://kodou.net/~tkng/mozilla-when-javascript-executed.diff
追記:ブラウザやOSでかなりCPU使用率に差が出るみたいだ。詳しくはこちら:Googleのトップページを開いた時の各ブラウザでのCPU使用率
- 小宮日記 - GoogleトップページのJavaScriptが100回の件
- ようつべ班長のソフトなH好きブログβ - そりゃ早いわけだ
- merom686の日記 - Googleのトップページは重くないと思う
- R日記 そのに - Googleのトップページを開くと毎秒100回JavaScript...
- メモ帳 - googleって実は凄い事をやっている
- 射撃しつつ前転 - 毎秒100回の落ち穂拾い
- ある二宮ひかるファンの日記 - つぶやきその9
- おれさま新聞 - ●携帯料金
- ?D of K - 毎秒100回対策を20分で書いてみようとして失敗したという...
- 極楽せきゅあ日記 - グーグルトップページの100回スクリプト(笑)
- 貳佰伍拾陸夜日記 - Google日本語入力がやっているデータ収集方法...
- 射撃しつつ前転 - 2009年に書いた記事とかを振り返る
- 射撃しつつ前転 - たくさんタブを開く人にとってFirefox 5は福音と...
- 4260 http://tbn2.blog50.fc2.com/
- 2709 http://b.hatena.ne.jp/
- 1984 http://gigazine.net/index.php?/news/comments/20091001_headline/
- 1819 http://b.hatena.ne.jp/hotentry
- 841 http://reader.livedoor.com/reader/
- 743 http://www5b.biglobe.ne.jp/~nnaro/brainstorm.html
- 734 http://sshiori.dtiblog.com/
- 733 http://egone.org/
- 636 http://purotora.com/
- 523 http://tbn2.blog50.fc2.com/blog-entry-1182.html
2006 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 02 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 |