効率的かつ高速になった Firefox 7

原文:Firefox 7 is lean and fast | Nicholas Nethercote

要約
Firefox 7 は Firefox 6(および4、5)に比べておよそ20%~30%、場合によっては50%ほどメモリの使用量が少なくなりました。細かく述べると、Firefox 7 では、一晩中動作してもメモリ使用量が殆ど変わらず大量のタブを閉じた場合に解放されるメモリが増えました

これにより、一度に数多くの Web サイトを開いたり、そのまま再起動するまで長時間 Firefox を起動させ続けた場合でも、Firefox 7 は(ときどき劇的なほどに)高速に動作し、クラッシュの発生も少なくなっています。

背景
Firefox はメモリを大量に使用することはもっぱら評判であり、長年にわたってメモリの使い方の効率性を高める改良を加えてきました。例えばFirefox 2でのメモリ効率は著しく悪いものでしたが、Firefox 3、3.5、3.6では着実に効率良くなってきました。ですが(全てではないものの)数多くの新機能の追加、とりわけ JavaScript のガベージコレクションと画像のデコードに関連するであろう徹底したチューニングのために、Firefox 4のメモリ効率は悪化してしまいました。

このため Mozilla のエンジニア達は、メモリ使用量の改善を通じて Firefox の動作速度と安定性の向上を目的とした MemShrink と呼ぶ取り組みを開始しました。このプロジェクトはわずか7週間で大きな進展を見せており、Firefox が新たに始めた高速リリースサイクルのおかげで、これらの改善は最終的に12-18週間ほどで正式版へと搭載できる見込みです(これらの改良は Aurora または Beta チャンネルで一足先に試すことができます)。Firefox 7 は MemShrink の成果と意義が反映される最初の正式版となります。

改良の効果
一般的と呼べるベンチマークも無く、ユーザーによって基準とすべき要因も異なり、ブラウザーの動作に大きく依存するため、メモリ使用量の計測は難しいものです。両手で数えられるほどのタブしか開かないユーザーと、100前後のタブを開くようなユーザーとでは、状況が全く異なります(多くの人は一度にそんなに大量のタブを開くなんて信じられないと思うかもしれませんが、それほど特殊なケースと言うわけでもないのです。例として、ここここのコメントスレッドを挙げておきます)。

耐久テスト
Dave huntらによって MozMillアドオンを使用した”耐久テスト“が実施されました。これは非常に多くの数のWebサイトを開いたり閉じたりすることで綿密にメモリの使用状況を追跡することを目的としました。Deve は、30個のタブで100近いWebサイトを開いて閉じる操作を繰り返す耐久テストを最近実施し、開発版のFirefox 6、7、8を比較しました。それぞれのバージョンにおいて5回以上テストを行った場合の、”常駐している”メモリ使用量のピークと平均が下記の図では示されています(“常駐している”メモリ使用量とは、Firefox によって使用されている物理メモリの値を意味しており、実際の動作環境と変わりない状態の計測となっています)。

耐久テストにおける常駐メモリの平均使用量耐久テストを通した常駐メモリ使用量のピーク

テストの実行毎に値が大きく異なっているのがわかります。テストの結果をペアワイズ比較したところ、メモリ使用量の減少幅は以下のようになりました。

  • 最小減少幅:1.1%-23.5%(中央値 6.6%)
  • 最大減少幅:-3.5%-17.9%(中央値 9.6%)
  • 平均減少幅:4.4%-27.3%(中央値 20%)

全バージョンの Run 1 の間を通したメモリ使用量の変化が下の2つのグラフによって示されています。Firefox 6のグラフが最初、Firefox 7のグラフは弐番目となっています(※紫の”Resident<訳注:常駐しているメモリ量>”の線だけを比較してください。緑の”explict”の線はバージョンによって異なるの変化を示しているため、2本の緑の線では正確な比較ができません)

テストを実行した際のFirefox6のメモリ使用量

テストを実行した際のFirefox 7のメモリ使用量

Firefox 7では、グラフの値は2本とも低く変化が少ないため、明らかに改善されていることがわかります。

MemBench
Gregor Wagner は MemBench と呼ばれるメモリ仕様のストレステストを用意しました。このテストでは、タブ毎に1.5秒間隔を与えて、150のWebサイトを連続して開きました。開いたサイトの殆どはAlexa のトップサイトリストから抽出されています。私<訳注:元記事の著者>の16GBのRAMを持つUbuntu Linux マシン上でFirefox 6 および 7の64bit版を用いてこのテストを実行し、それぞれの場合でストレステストを完了した時にabout:memoryを開き、常駐メモリのピーク値を計測しました。そのときにabout:memory中の“Minimize memory usage”ボタンを、メモリ使用量が再び安定するまで何度か押し、常駐メモリの値を再度計測しました(通常の使用をしている限りではこのボタンを押す必要はありませんが、直ちにFirefoxにガベージコレクションが実行させメモリを解放することができるので、テストを目的とする場合には有用な機能となっています)。

Firefox 6では、ピーク時の常駐メモリは2028MB、最終的な常駐メモリは669MBとなりました。一方Firerox7では、ピーク時は1851MB(8.7%の減少)となり、最終的な値は321MB(52.0%の減少)となりました。この数値により、Firefox7ではメモリ断片化の問題は非常に小さなものとなっていることが示されています。

(余談ではありますが、Gregorは開発版のFirefoxとGoogle Chromeにおいても同様の計測を行いました。多くの人が驚くであろう結果となっています)

ブックマーク
Legit ReviwsのNathan KirchはFirefox7とFirefox5を比較する単純なテストを実施しました。彼は117のブックマークを含むブックマークフォルダの「タブで全て開く」をクリックし、それぞれのブックマークを別々のタブに開く手法を用いました。全てのタブの読み込みが完了した後、Windowsのタスクマネージャーの”プライベートワーキングセット”の欄から計測を行いました(プライベートワーキングセットは、”常駐しているメモリ”と同義ではありませんが、非常に関連が高いものではあります)。Firefox7はFirefox5に比べて500MBもメモリ使用量が少なく、39.7%も減少していたということです。

結び
これらのテストは人工的に再現したものであり、ユーザーの実際の使用実態と確実に一致するもので無いことは明らかです(ベンチマークでの改善は我々がMemShrinkで取り組んでいることの一部ではありますが、まだまだ先は長い取り組みです)。とはいえ基本的な操作に関しては同じものであり、このテストでの改良が実際に使用している場合においても反映されていると期待してします。

改良点は明白な負荷に依存するものではありますが、先行するバージョンに比べて、おおよそ20%から30%、時には50%にも及ぶメモリ使用量の改善が、Firefox 7ではなされていることをユーザーは実感できるでしょう。事実、開発版のユーザーからのフィードバックには、Firefox 7は、Firefox4、5、6に比べて高速かつ軽快に動作しており心地よいといった感想が多く見られます。

メモリ使用量の減少は、クラッシュ、および32bit版のみが提供されているために仮想メモリの2GBの制約が存在するWindows上でのひっかかりの減少といった結果として表れます。

MozillaのMemShrinkの取り組みは今後も継続されます。耐久テストの結果は既にFirefox8の開発版のメモリ使用量の改善に現われており、このような改良を継続することで更なる効果が現れることを期待しています。同様に将来的なメモリ使用量のリグレッションを防ぐため、テスト環境の改善も予定しています。