BT

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

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Dart2jsがDeltaBlueベンチマークで手書きJavaScriptコードのパフォーマンスを上回る

Dart2jsがDeltaBlueベンチマークで手書きJavaScriptコードのパフォーマンスを上回る

ブックマーク

原文(投稿日:2013/04/10)へのリンク

 

Googleが Dart2jsコンパイラの新バージョン をリリースした。生成されるJavaScriptコードのパフォーマンスは,オブジェクト指向言語で一般的に利用されている DeltaBlueベンチマーク において,手書きのJavaScroptを上回っている。手書きJavaScriptコード以上のパフォーマンスの実現がDart2jsプロジェクトの目標ではなかったが,メソッドのインライン化やプリコンパイルなどの最適化を実施した結果,いくつかのプログラムにおいてDartプログラムの方が,慣用的な記法のJavaScriptコードより速く動作するようになったのだ。Dartサイトで公開されている もうひとつのベンチマークであるRichardsベンチマークでも,両者の値は徐々に接近してきている。ただし現在はまだ,Dartの生成するJavaScriptのパフォーマンスが手書きのコードよりも 26%遅い。

以下のグラフからは,DeltaBlueベンチマークによるDartのパフォーマンスが徐々に向上している様子が見て取れる。

グラフの紫色のラインは,Dart2jsの生成したJavaScriptコードをGoogleのv8 JavaScriptエンジンで動作させた場合を表している。黄色のラインはv8で実行した一般的なJavaScriptコード,一番上にある青色はDart VM 上でDartコードをネイティブ実行した場合である。値が大きいほどパフォーマンスがよい。

Googleが大規模Webアプリケーション用に開発した新言語 Dart は,さまざまなコンテキストで動作可能である。

  1. ブラウザ組込のDart VM内。Dartプロジェクトはまだバージョン1.0をリリースしていない。そのため現時点でDart VMを組み込んでいるブラウザは,Dart SDKに付属している Chromium "Dartium" ビルド のみである。
  2. サーバ上で動作するDart VM。サーバサイド・アプリケーションのみ使用可能な dart:io ライブラリが,ファイルシステムへのアクセス,プロセス管理,サーバ構築 (HTTPサーバまたはwebsocketサーバ) を行うAPIを提供する。これによってNode.jsに非常に近いユースケースでDartを使用可能になり,アプリケーションのフロントからエンドまでをDartで開発することができる。
  3. アプリケーションへの組込。 Dart VMを任意の (C/C++) アプリケーションに組み込んで,Dartスクリプティングをサポートすることができる。
  4. ブラウザ内でJavaScriptへコンパイルする。 現時点でDartをサポートする製品版ブラウザはなく,Chrome以外のブラウザが将来的にDart VMを組み込むかどうかも明確ではない。そのようなブラウザ上でもDartコードを実行可能にするため,Dart2jsコンパイラでDartプログラムをJavaScriptに変換する。したがってDartが成功するためには,生成されたコードのパフォーマンスは非常に重要だ。

新しいDart2jsコンパイラは,それ自身がDartで実装されている。大域 型推論 (global type inferencing) と呼ばれる技術を用いて,変数や引数が実行時に所持する型の情報をより多く収集することによって,従来よりもコンパクトで高速なJavaScriptコードの生成が可能になった。 興味深いことにDart2jsでは,Dartがサポートしている Optional Type Annotation を利用しない。その理由は,型制約の違反がエラーとして通知される チェックモード でDartを実行しない限り,アノテーションによる型指定は実行時には適用されないからだ。たとえば String name = 10; のように書いたとしても,困惑はするにせよ,文としては完全に有効なのだ。このことから,生成されたコードの正しさを保証するためにコンパイラでは,型アノテーションを無視するようにしている。

数多くの最適化処理が可能なのは,DartがJavaScriptほど自由な言語ではないためだ。たとえばJavaScriptでは,オブジェクトにメソッドを動的に追加することや,メソッドの置き換え,動的なコードのダウンロード,evalwith 文の使用が可能である。これらがv8などのJavaScript VMでの最適化の実行範囲を狭くしている。Dartでは,これらの機能の多くがサポートされていないため,Dart2jsコンパイラの実行時に,どのコードが実行されるかを正確に把握できるのだ。使用されていないコードを取り除く,いわゆるデッドコード削除 (dead-code elimination) あるいはツリーシェイキング (tree shaking) も可能になる。さらにメソッドをインライン化できる場合もある。JavaScriptとは違い,Dartはオブジェクトへのモンキーパッチ (実行時のコード修正) をサポートしないからだ。

ベンチマーク結果は多少割り引いて受け取るべきものではあるが,Dart開発チームがパフォーマンスを着実に改善している様子が見られるのは興味深いことだ。Dartはまだ大規模な開発の途上にあるが,適用例もいくつか見られるようになってきた。Dart2jsの生成するコードのパフォーマンスとサイズは,現在DartコードをWebに展開しようと考えている人たちすべてにとって,重要な意味を持っている。

 

この記事に星をつける

おすすめ度
スタイル

BT