Edgeの高速化に寄与する、JavaScriptエンジン「Chakra」の技術要素と新機能「Windows 10 Creators Update」で実装

マイクロソフトが、標準ブラウザ「Microsoft Edge」のJavaScriptエンジン「Chakra」へ追加された新たな機能を紹介した。新しいEdgeは、「Windows 10 Creators Update」に含まれている。

» 2017年04月25日 10時00分 公開
[@IT]

 米マイクロソフトは2017年4月20日(米国時間)、Windows 10の標準ブラウザ「Microsoft Edge(以下、Edge)」に搭載されるJavaScriptエンジン「Chakra」に追加された新機能を紹介した。新機能を実装したEdgeは、先日公開されたWindows 10の大型アップデート「Windows 10 Creators Update」に含まれている。

 Windows 10 Creators Updateに含まれるEdge(以下、新Edge)には、Chakraの新機能によってJavaScriptエンジンの性能を高める機能の他、WebAssembly、Shared Memory、Atomicsといった開発者向けの試験的な機能が実装されている。なお、ChakraはInternet Explorer 9で採用されたJavaScriptエンジンで、2015年にオープンソース化されている。

 JavaScriptエンジンの性能向上は、主に、関数の再延期機能、ヒープ引数の最適化、ミニファイアが適用されたコードの性能向上が寄与している。

関数の再延期によるメモリの節約

 これまでChakraは、特定の条件を満たす関数について、開始時に構文エラーをチェックし、関数が最初に呼び出されるまで、完全な解析とバイトコード生成を遅らせる解析延期機能を提供していた。この機能には、ページ読み込みの高速化、冗長な関数での時間浪費の回避、メモリ割り当ての効率化が行える利点があった。

 新Edgeでは、この解析延期機能をさらに有効活用するようにチューニングされ、関数の再延期機能を用いることで、メモリの利用効率を一段と向上させた。関数の再延期は、関数を開始時に延期し、ある時点でその関数が呼び出された後で再度延期するというものだ。

photo 関数fooは開始時に延期され、ある時点で呼び出され、再度延期されている
photo 関数の再延期によるメモリ割り当て量の削減効果

ヒープ引数の最適化

 関数が引数オブジェクトを使用する場合、Chakraは常に、必要に応じて“ヒープ引数”オブジェクトを作成し、フォーマルパラメータと引数オブジェクトが同じメモリ位置を指すようにしている。だが、そうしたヒープ引数オブジェクトの割り当てはコスト高につながる。そこでChakraのJIT(Just-In-Time)コンパイラでは、関数にフォーマルパラメータがない場合は、ヒープ引数を作成しないという最適化を行っている。

 新Edgeでは、このJITコンパイラの最適化が拡張された。フォーマルパラメータへの書き込みがない場合は、フォーマルパラメータが存在しても、ヒープ引数を作成しないようになすることで最適化を図っている。

ミニファイアが適用されたコードの性能向上

 Chakraではこれまで、よく使われるJavaScriptの圧縮ツールの1つである「UglifyJS」の適用後に見られるコードパターンを最適化するようにしていたが、新Edgeではそれと同様に、同じく広く使われる「Closureコンパイラ」の適用後のパターンも最適化の対象とし、各種の手法で最適できるようになった。これにより、Closureや、同じパターンに従う他の圧縮ツール適用後のコードの実行速度が目に見えて向上したという。

WebAssembly

 WebAssemblyは、新しいポータブルなWeb用バイナリフォーマットで、サイズの軽減や読み込みの効率化が図られている。ネイティブに近いパフォーマンスの実現を目指しており、ゲームやマルチメディア、エンコード/デコードなど、高いパフォーマンスが要求されるワークロードの有効なソリューションを提供する。マイクロソフトはWebAssembly Community Groupに参加しており、モジラ財団、グーグル、アップルといった他の主要ブラウザベンダーと協力し、WebAssemblyの開発を進めている。

 最近、ブラウザベンダーの間でMVP(Minimum Fiable Product)フォーマットについて合意が成立した。新Edgeではこれを受けた試験的な機能として、WebAssembly MVPをサポートした。Edgeの「about:flags」ページで、「試験的なJavaScript機能を有効にする」のチェックボックスをチェックすると、WebAssemblyなどの試験的な機能を利用できるようになる。

Shared MemoryとAtomics

 ES2017(ECMAScript仕様の最新バージョン)で間もなく承認されるShared MemoryとAtomicsは、Web上での並列プログラミングの改善に使用される。これらも新Edgeで、試験的なJavaScript機能を利用できるようにした。

 AtomicsはShared Memoryオブジェクトであり、Atomicsが提供するメソッドは、同じくShared MemoryオブジェクトであるSharedArrayBufferで使用される。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。