この前、CPUクーラーのグリスを塗りなおしたところ、CPU温度は十度以上下がり、もってファンをコントロールする目安となるCPU温度も下げることを得、しかもファンはとても静かになった。ところが、Google Chromeを導入してからというもの、ファンの回転数がわずかに上がったような気がする。2ch.netでは、Google Chromeを起動するとファンが爆音を発するという人もいる始末。これは一人私の環境だけのせいではあるまい。しかし、Google Chromeは、別にCPU時間を大量に消費しているわけではない。Chromeはマルチプロセスであるが、ご存知の如く、プロセスと言う実行単位はない。実行されるのはあくまでスレッドなので、マルチプロセスは関係ない。これは一体どういうことか。
どうも、Google ChromeはtimeBeginPeriod(1)を使用しているらしい。
NyaRuRuの日記 Chromium (Chrome) のソースを読む
timeBeginPeriodは、一種魔法のAPIのように見える。これさえ呼び出せば、タイマーの精度が見違えるほどよくなるのだ。しかし、これには仕掛けがある。MSDNを読めば分かるように、タイマーの精度を上げるということは、それだけスレッドの切り替えを頻繁に行わなければならないということだ。考えてみればその通りで、シングルプロセッサ環境で、1msecの精度を実現するのに、あるスレッドが2msecも走っていたのでは、到底おぼつかない。そんなわけで、スレッドのスケジューラは、指定されたタイマー精度を考慮して、スレッドの切り替え時間を変えなければならない。スレッドの切り替えが頻繁になると、それだけタイマーの精度は上がるが、全体としてのパフォーマンスは落ちる。
それだけではない。最近はコンピュータの省電力性が大いに叫ばれ、ハードもソフトも省電力を実現するための機能を備えているが、timeBeginPeriodを悪用すると、この省電力機能が働かなくなる。すべて、要求されたタイマー精度の実現を最優先するためだ。
当然の如く、これらの設定はグローバルなもので、システム全体に影響を及ぼす。だから、よく言われるおまじないのようなものがある。曰く、「このソフトは、Windows Media Playerと一緒に起動していると、キビキビ動くようになるぜ」といった類のおまじないだ。Windows Media Playerは、音声や動画を再生するソフトウェアなので、当然の如く時間にシビアである。さもなければ、音とびやコマ落ちが発生する。それではメディアプレイヤーの役割を果たさないわけだから、WMPはtimeBeginPeriodを使う理由がある。しかし、別のプログラムは、それほどタイマーの精度が高くなくても、問題なく動作するので、timeBeginPeriodを使う必要は無い。
さて、JavaScriptのタイマーには、本当に1msの精度が必要だろうか。Flashでさえ、Flash Player 10で、timeBeginPeriodの使用をやめるというのに。まあこれは、省電力のほか、Vistaではオーディオスタックが違うという理由もあるのだけれど、MSやIntelから省電力の強い圧力がかかっているのだから、やはり省電力だろう。
No comments:
Post a Comment