BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース JavaScriptエンジンV8バージョン8.0がリリース、ヒープを40パーセント削減し、Optional ChainingとNull Coalescingを追加

JavaScriptエンジンV8バージョン8.0がリリース、ヒープを40パーセント削減し、Optional ChainingとNull Coalescingを追加

原文(投稿日:2019/12/21)へのリンク

GoogleのV8 JavaScriptエンジンの最新リリースであるV8 8.0は、ポインタ圧縮を採用することで、パフォーマンスを低下することなく、ヒープを40パーセントにまで削減している。?.演算子を使用したOptional Chainingと、??によるNullish Coalescenceも追加された。V8 v8.0はChromeバージョン80で正式に公開される。

V8 8.0では、ヒープやSmall Integerへのポインタ表現に使用されるJavaScript Tagged Valueの圧縮を行っている。64bit CPUのポインタ表現に必要な64bitすべてを用いる代わりに、下位bitのみを使用して、上位bitと合成する方法を採用した。ポインタ圧縮に関する具体的な方法は公開されていないが、このテクニックは、Javaなど他のプラットフォームでも使用されている。その基本的な概念は、メモリをバイト単位ではなくワード単位で管理する、という考え方だ。8byteのワードを使用する場合であれば、ロケーション0、7、15、23などから始まるアドレスを表現できればよい。アドレスの上位(または下位、基盤となるアーキテクチャに依存する)bitは、このシナリオでは常に0であるので、省略しても問題なく、ポインタサイズを削減することが可能になる。

この方法で重要なのは、V8チームによれば、ポインタ圧縮がパフォーマンスコストを伴わないことだ。この主張は、先に紹介したJavaで採用されている圧縮ポインタが、比較的高速なオペレーションであるビットシフトのみを伴うものである、という点から来ているものと思われる。V8のケースでは、ガベージコレクションの高速化という副次的なメリットもある。予備的なベンチマークによると、この変更を行ったV8 v8.0は、FacebookやCNN、Google Mapといった現実のWebサイトにおいて、モバイルおよびデスクトップデバイスのいずれも速度が向上している。

JavaScriptの面では、V8 v8.0ではOptional ChaniningNullish Coalesceneという、2つの有用な構文規則のサポートが導入されている。

Optional Chaniningは、途中のオブジェクトがnullあるいはundefinedであった場合に例外が発生するリスクを回避することで、プロパティへの直列的な参照を容易にするものだ。この種エラーの発生を避けるには、例えば次のコードのように、中間のプロパティがすべて正しく定義されていることを事前にチェックする必要がある。

if (resource && resource.address && resource.address.types)
  return resource.address.types.length

Optional Chaining演算子?.を使うことで、これを次のようなコードに置き換えることが可能になる。中間のコンポーネントがnullまたはundefinedであれば、式全体がundefinedに短絡化されることが保証される。

return resource?.address?.types?.length

Nullish Coalescence演算子??は、次のようなコンテキストで使用される||を改善するものだ。

let iterations = settings.iterations || 4;

上記の||演算子には、設定しようとする値、上記の例であればsettings.iterationsfalseと評価される場合、例えばsettings.iterations==0の場合には使用できない、というデメリットがある。この例では、結果としてデフォルト値、上記の式ならば4が設定されることになる。Nullish Coalescing演算子??を使用すれば、このようなケースにも対処することができる。例えば、

let iterations = settings.iterations ??4;

これによって、a??bは、anullまたはundefinedの場合のみbと評価されるが、それ以外はaと評価される。

V8 v8.0はまだ公式な安定版V8リリースではないが、数週間の内にChrome 80安定版とともに提供される予定である。現時点では、git checkout -b 8.0 -t branch-heads/8.0を使えばアクセスできる。

この記事に星をつける

おすすめ度
スタイル

BT