射撃しつつ前転 RSSフィード

2009-09-30

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

 FirefoxCPUを常に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から別のなにかに変えておこうと思った。f:id:tkng:20090927063418p:image:right

 他にもいくつか頻繁に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使用率

サワサワ 2009/10/01 09:03 もしかしてこれか!
Google表示されてすぐに検索ワード打ち込むと
恐ろしい勢いで同じ語句が連打される。
Backspace押すと消えるどころか逆に増えていくんだよ。

piro_orpiro_or 2009/10/01 15:31 > あと、これはページではないが、Firefoxの拡張で情報化タブをインストールすると、サムネイルのアップデートのために、かなり頻繁にJavaScriptが呼ばれるようだ。レンダリングの完了を通知するイベントがFirefoxにあるとは思えないのでこれも仕方なさそうだが、CPU使用率に影響するみたいだ。

おそらく、スクロールに追従してサムネイルを更新する処理や、タブの選択状態の変化の監視などが原因ではないかと思います。
負荷が少しでも減るよう、次版で手を入れてみたいと思います。

ちなみに、MozAfterPaintというイベントで、レンダリング結果が変化した箇所の矩形領域を検出することができ、情報化タブでは「アニメーションに合わせてプレビューを更新する」にチェックが入っている時はこれを使うようにしています。ただ、洒落にならないくらい重くなるのでデフォルトではOFFにしてます。

BTXBTX 2009/10/01 21:26 古いパソコン(や細い回線)を使っている人の身になって欲しいですね。
OPERAでクリックするまでyoutubeの動画は読みに行かない、AMAZONの書影は読まない(コンテンツブロック)設定にしていましたが…

tkngtkng 2009/10/04 03:46 >サワさん
 機能的にはそれを実現しているところですが、問題としては別の問題です。ただ、文字入力回りはOSでAPIが違ったり、そもそもWindowsでもIMMとTSFの2つのAPIがあってまだ移行期だったりとしてややこしいので、そういうバグがあったら、みんな苦労してるんだなぁという目で眺めていただければと思います。
>piroさん
 あら、MozAfterPaint、便利そうなのに、重いのは残念ですね。情報化タブ、次のバージョンが出たらまた入れてみます。
>BTXさん
 ウェブはどんどんと重くなる一方ですね…。OperaだとJavaScriptのオンオフを簡単に切り替えられるツールがあるみたいなので、そういうのを使うとちょっと快適になるかもしれません。

sounisi5011sounisi5011 2014/12/26 14:25 今はDOM Level 3 Eventsでinputイベントがあるので、この問題は解決しているでしょう。
同じ動作をinputイベントで実装できるからです。

なお、これと同じ構想でテキストボックス内の入力チェックコードを実装してみました。
テキストボックスにフォーカスしている時のみタイマーを動かすので、実行コストは低くなると考えています。
http://qiita.com/sounisi5011/items/767392c1f7736e2e5d4c

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

2005 | 04 | 05 | 06 |
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 | 03 | 05 | 06 | 11 |
2013 | 01 | 05 |