Windows Internet Explorer 9 |
IE9開発版の最新版となるIE9 Platform Preview 7が公開された。IE9 PP7における最大の特徴はJavaScriptエンジンの調整が実施され、実際のWebサイトやWebアプリケーションにおけるJavaScriptの実行がより高速化された点にある。すでにベンチマーク試験としての意味はないとしているが、SunSpiderを使ったベンチマークでベータ版も含めた主要最新ブラウザで最速をマークしたことが紹介されている。
HTML5, and Real World Site Performance: Seventh IE9 Platform Preview Available for Developers - IEBlogには、ほかのブラウザとIE9 Test Driveに追加された新しいデモを実行した比較動画が掲載されている。
Shakespeare's Cloud - Internet Explorer 9 Test Drive実行例 - IE9 PP7 |
Shakespeare's Cloud - Internet Explorer 9 Test Drive実行例 - Firefox 4 beta 7 |
HTML Sudoku - Internet Explorer 9 Test Drive実行例 - IE9 PP7 |
HTML Sudoku - Internet Explorer 9 Test Drive実行例 - Chrome 9開発版 |
Galactic - Internet Explorer 9 Test Drive実行例 - IE9 PP7 |
Galactic - Internet Explorer 9 Test Drive実行例 - Chrome 9開発版 |
比較動画ではIE9がFirefoxやChromeよもりかなりいい結果を出すが、手元でそれぞれFirefox 4 beta 7とChrome 9開発版と比較したところ、Shakespeare's CloudではFirefoxとChromeの方が高速だった。HTML SudokuではFirefoxは遅かったが、IE9 PP7よりもChromeの方が速かった。
実行するH/Wなどの条件によっては比較動画に掲載されているほどのパフォーマンスは期待できないのかもしれない。なお、レンダリング性能はH/Wアクセラレーションが無効になった環境であっても、IE9 PP7の方が優れている。レンダリングではほかのブラウザから一歩抜きん出ているようだ。
IE9 PP7におけるJavaScriptの高速化にはさまざまなテクニックが使われていると説明があるが、特に、実行において意味のないコードを削除する「デッドコード削除」および「デッドストア削除」と呼ばれるテクニックを適用した結果だと説明がある。たとえばサンプルコードとして次のコードが掲載されている。
function func() {
var x = 1;
var y = 3;
var w = x + y;
if (w != 4) {
// dead code
}
}
このコードではif文の中が評価されることがないので、これは削除対象になるという。こうすることでコンパイル後コードのサイズが小さくなるほか、実行速度も高速になるという仕組みだ。これは次のようにループになっている場合に、特に効果があるという。
function func(a, b) {
var x;
var i = 300;
while (i--) {
x = a + b; // dead store
}
}
ここでは「x = a + b;」の結果は常に変わらないので、これは一度だけ評価すいればいい、というわけだ。さらに、次のように演算はしているが、その結果が利用されていない場合にはループそのものを削除できると説明がある。
function sum() {
var a = [1, 2, 3, 4, 5];
var sum = 0.0;
// dead loop elimination
for (var i = 0; i < 5; i++) {
sum += a[i];
}
}
IE9 PP7が実際のこうしたデッドコード削除を実施しているかどうかはブログに掲載されている説明からは判断できないが、この方法には問題があるということをFirefoxのJavaScriptエンジン開発者であるRob Sayre氏がDead Code Elimination for Beginnersにおいて説明している。説明によれば、IEBlogに掲載されているデッドコード削除をそのまま適用したのでは、削除してはいけないケースでも削除が実施されてしまい、正しく動作しないと説明がある。また、IE9 PPに搭載されているこれらデッドコード削除機能が原因とみられるバグがあることも指摘されている。
デッドコード削除はコンパイラテクニックとしては一般的なもののひとつ。IEBlogでは、こうした最適化に時間をかけると逆に実行速度が遅くなることから、最適化にかける時間と実行に移る時間のバランスをみながら、ちょうどいいところを模索しているという。また実際によくみられるコーディングパターンに一致するようにチューニングをしていると説明があり、最適化が実施されるケースと実施されないケースがある切り分けはそのあたりに理由がありそうだ。
IE9 PP7における高速化が今後のIE9に反映されることになるのか、リグレッションとして処理され差し戻しになるかどうかはわからない。しかし、IE9はIE8やIE7と比較してJavaScriptの処理速度がきわめて高速化していることは間違いなく、ほかの主要ブラウザの最新開発版と同じレベルまで性能が向上していることも各種ベンチマークの結果からそれほど違わないとみられる。なお、IE9 PP7はCSS3 Transformの実装が追加されるなど、機能の強化も実施されている。