2014 dart flight school in Tokyo

1,397 views

Published on

2014 dart flight school in Tokyo
dart vm overview

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,397
On SlideShare
0
From Embeds
0
Number of Embeds
78
Actions
Shares
0
Downloads
2
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

2014 dart flight school in Tokyo

  1. 1. Dart VM の紹介 Outline  Dart VM 1.1  Dart2js 1.1  Dart VM の特長 2014/02/22 Dart Flight School 2014 Tokyo nothingcosmos <nothingcosmos@gmail.com>
  2. 2. 自己紹介  Twitter:nothingcosmos  名前 : 坂頂佑樹 所属 :  趣味 :OSS のコードを弄る  Blog:http://nothingcosmos.blog52.fc2.com/  Dart VM Advent Calender 2012 http://nothingcosmos.github.io/DartVM/index.html  Dart VM のソースコードリーディング
  3. 3. Dart VM のゴール
  4. 4. Dart VM 1.1  Dart VM とは、 JVM 、 V8 みたいなもの。  Dart のコードを JIT コンパイルして高速に実行可能  対応アーキテクチャは、 x86/x64/arm/mips  対応 OS は、 Linux/Windows/MacOS/Android  ここ半年で ARM + Android 対応完了  V8 より高速だが、 2 倍はいかない。 一時期はほぼ 2 倍差をつけたけど、その後 V8 が怒濤の追い込み。。 今は V8 の 40 ~ 50% 速いくらい
  5. 5. Computer Language Benchmark Games x86 Ubuntu™ Intel® Q6600® one core Dart / Java7 IO が List<int> 結構遅い Java なのに GMP 使ってる BigInteger 同士だと等速 Dart は簡易 regex engine のみ ブラウザ搭載時に Irregexp に置き換え
  6. 6. ここ 1 年くらいの Dart VM  2013/01 arm mips の skeleton を追加。 Typed array の高速な実装を追加  2013/02 mixin を追加開始  2013/03 Field type feedback 最適化を追加し、全体的に 30% 程度性能向上  2013/04 ARM と MIPS の simulator 上のコンパイル、動作確認  2013/06 On-Stack Replacement の追加  2013/07 NEON 対応。 Mirror の高速化  2013/08 Profile Guided Code Positioning の追加  2013/09 ARM 対応ほぼ完了。 vm service を追加開始  2013/10 Constant Blinding の追加。  2013/11 Dart 1.0 リリース  2013/12 Field 操作の mutable 化  2014/01 Dart 1.1 リリース
  7. 7. dart2js 1.1  Dart で開発されている、 Dart から JavaScript への変換 Dart VM がないブラウザでも動作可能  高速化中、手書きの JavaScript V8 と等速、ちょい速いくらい。  Dart 1.0 より、ベンチマークの Richard が 25% アップ。 http://news.dartlang.org/2014/01/dart-11-features-up-to-25-faster.html  いろいろと最適化を追加して高速化と出力 js の圧縮を頑張っている  ベンチマークは Octane や Dromaeo や Box2D っぽい。
  8. 8. Dart2js Tracer Benchmark https://www.dartlang.org/performance/ SsaLoadElimination type_graph_inferrer
  9. 9. Dart VM の特長 ここから VM の雑学  JIT コンパイル  Dart VM Architecture と Isolate  Snapshot と高速起動  Message passing と Event Driven  Optional Typing & Generics & Checked Mode  Dartium
  10. 10. Dart VM と JIT コンパイル (1)  インタプリタなし、 2 段階の JIT コンパイル  IRHydra がわかりやすい。 http://mrale.ph/irhydra/2/#demo-4 Entrypoint である mainscript を SingleThreading で JIT コンパイルしてから実行する 関数呼び出し fibo を見つける fibo はまだコンパイルしていないため、 fibo 関数を JIT コンパイルする
  11. 11. Dart VM と JIT コンパイル (2)  最初の JIT コンパイルは、 どんな型でも動くように汎用コンパイル  型情報の収集を埋込 fibo 関数を JIT コンパイルした後、 fibo 関数の実行に戻る fibo 関数を再帰的に実行 コンパイル済みの汎用コードを実行する
  12. 12. Dart VM と JIT コンパイル (3)  何度も実行される関数は、最適化 JIT コンパイル 収集した型情報を利用し、 型を特殊化してコンパイル、高速に実行可能 fibo 関数を何度も実行すると、 fibo 関数の最適化 JIT コンパイルが走る。 汎用的な fibo から、最適化した fibo に置き換え Heap が足りなくなったら、 全体の動作を止めて、 GC を実行し、 heap を確保する。
  13. 13. Dart Dart VM Architecture Dart の世界 Debugger で 追える境界 sdk/lib/io NativeSymbol C++/Asm OS/Kernel sdk/lib patch_class VM の境界 Native Extensions シンボルを定義 runtime/lib/*.cc runtime/bin/*.cc IO_NATIVES BOOTSTRAP_ NATIVES runtime/lib runtime/bin I/O や Network を非同期に実行 runtime/platform runtime/ include runtime/vm runtime/vm/os OS(Linux, Windows, MacOS, Android) ISA(arch) ia32/x64/arm/mips VM が担当する 計算やリソース管理
  14. 14. Dart VM Isolate Isolate 横断 BOOTSTRAP_NATIVES Dart レイヤから C++ への binding/Native Extentions JITCompiler のみ インタプリタ無し intrinsifier/runtime_entry compiler GC Isolate ごとに GC と heap object pool/code heap isolate port_map Message Passing は port 経由 dart context runtime stubs Dart_Api include Isolate 単位に独立 Single Threading で 動作する thread_pool OS の Process VM の共有リソース
  15. 15. Isolate Spawn ここより上の Dart のレイヤーには Lock が存在しない intrinsifier/runtime_entry runtime stubs dart context object pool/code compiler GC heap runtime stubs compiler GC isolate Thread port_map isolate 間は port 経由で message passing dart context object pool/code heap Spawn した Isolate Dart_Api include isolate Lock は不要 独立して実行 Thread thread_pool OS の Process 共有リソースでは Lock するが、 非常に少ない。
  16. 16. Dart VM の特長 ここから VM の雑学  JIT コンパイル  Dart VM Architecture と Isolate  Snapshot と高速起動  Message passing と Event Driven  Optional Typing & Generics & Checked Mode  Dartium
  17. 17. Dart Snapshot  Dart VM の object の serialize/deserialize 機能 圧縮率と速度優先 アーキテクチャ非互換 (x86-x64-ARM 間の相互変換は不可能 )  起動の高速化  MessagePassing の際の serialize/deserialize にも使用する。 serialize した object を port 経由で送受信する。  自分の作ったライブラリもあらかじめ snapshot できる。  大体 JSON と同じだけど、追加で VM の内部 object も対象。
  18. 18. VM 起動の高速化  Dart VM は make の際に、 2 回 build を行う。 1 回目は dart_no_snapshot を build し、 SDK の core を読み込み起動。 core の dart src を scan し、 snapshot 、 snapshot_buffer[] に書き出し。  2 回目で snapshot_buffer[] を取り込んで dart を build する。 +400kbyte dart は Core の I/O と Scan を skip できるので、起動時間が短縮できる。 --time-bootstrap オプションで比較可能。  bootstrap が短縮、 100,000micros -> 100micros  Core の dart src を read して scan vs. binary から直接 deserialize
  19. 19. bootstrap の短縮 fibo(40) の実行時間 (ms) 130ms 540 dart_no_snapshot 410 fibo time 20ms 起動時のオー 430 バーヘッドが 1/6 scan が 100ms 410 から 0.1ms に dart 0 100 200 300 400 500 600
  20. 20. Isolate 間の MessagePassing SnapshotWriter serialize SnapshotReader deserialize Isolate Message HandlerTask Isolate Message Handler Message Handler Thread Message HandlerTask Thread port_map 相手の Isolate に message を送る ReceivePort を 全部 mapping してある
  21. 21. Isolate の StartUp(1) main が終わったら、 MessageHandler で EventLoop Task が Thread を生成 1 個だけ Isolate の初期化 Main script Async micro task 残っている限り 仕事し続ける。 Isolate Message HandlerTask Message Handler Thread thread pool dart.cc の main() 関数 port_map 並行して Message Receive
  22. 22. Isolate の StartUp(2) main が終わったら、 MessageHandler で EventLoop Main script async task が 残っている限り 仕事し続ける。 Isolate Message HandlerTask Message Handler Thread Message Receive port_map Unhandled exception: type 'double' is not a subtype of type 'int' of 'num'. #0 func (file:///syntax/lib/diff/future.dart:28:13) #1 main (file:///syntax/lib/diff/future.dart:33:7) #2 _startIsolate.isolateStartHandler (dart:isolate-patch/isolate_patch.dart:216) #3 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:115)
  23. 23. MessageHandler and EventLoop  https://www.dartlang.org/articles/event­loop/  Async 系の microtask は mainscript が 終了後に実行する。 2.streamFibo 3.scheduleMicroTask 5.run microTask 1.main の起動 6.async task 4.main 終了
  24. 24. MessageHandler and EventLoop #4 #5 #6 #7 #8 #9 #10 #11 #12 #13 Stream.forEach.<anonymous closure> (dart:async/stream.dart:473) 2.streamFibo _rootRunUnary (dart:async/zone.dart:695) _RootZone.runUnary (dart:async/zone.dart:834) _BaseZone.runUnaryGuarded (dart:async/zone.dart:546) 3.Loop _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:333) _DelayedData.perform (dart:async/stream_impl.dart:585) _StreamImplEvents.handleNext (dart:async/stream_impl.dart:701) _PendingEvents.schedule.<anonymous closure> (dart:async/stream_impl.dart:661) _asyncRunCallback (dart:async/schedule_microtask.dart:18) _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:119) 仮にここの async で error になったら
  25. 25. EventLoop And Zone  Zone は RootZone から parent が fork して 木構造でつながる。  scheduleMicrotask で 1Thrad で順次実行 Zone の木構造を辿り実行 zone root_zone zone
  26. 26. Dart VM の特長 ここから VM の雑学  JIT コンパイル  Dart VM Architecture と Isolate  Snapshot と高速起動  Message passing と Event Driven  Optional Typing & Generics & Checked Mode  Dartium
  27. 27. Dart Optional Typing  Dart には production mode と checked mode がある。  Dart には 3 つのフェーズがある。   compile フェーズ。 script 実行前の jit compile 時に error/warning 検出   analyzer フェーズ。 IDE による error/warning の検出 runtime フェーズ。実行時の型情報を validation する。 checked mode では、 compile フェーズで型エラー /warning を無視しない。 compile 時に型情報の validation 命令を挿入し、実行時に assert する。  Dart の型は、 type annotation による validation と割り切っている。 validation のタイミングは上記 3 つ。 runtime に影響を与えない。
  28. 28. Dart Optional Typing  Dart の型の違反は、基本的に warning 扱い  何が error で何が warning かは、他の言語と比較すると結構曖昧かも。 Breaking on exception: type 'double' is not a subtype of type 'int' of 'num'. int sum = 100 + 100.0; int num = 100.0; IDE/ コンパイル時に warning と分かるし、 binaryoperator(+) の 2 引数の validation 命令を JIT コンパイル時に挿入する。 実行時に validation されて warning こちらは = の assign に validation 版の命令を JIT コンパイル時に挿入する。 実行時に validation されて warning Breaking on exception: type 'double' is not a subtype of type 'int' of 'num'.
  29. 29. Dart Generics  Class の Reified Generics のみ ( 型パラメータを保存する領域あり ) Generics を使用した場合のみ、 Class のインスタンスを new する際に、 型パラメータを保存する命令を挿入する。 TypeArguments っていう IR が存在する。  型パラメータは、実行時にいつでも参照できる。  Method generics は存在しない。  型パラメータを参照するのは、 checked mode のみ。 Generics の型パラメータも validation される。
  30. 30. Dartium dartium 標準化された API を IDL から自動生成 dartium 連携用 native symbol Web IDL Auto-generated library sdk/lib/html dart runtime sdk/lib dartium で定義された シンボルを Native Extensions を使用して直接呼出て連携する。 runtime/ include dartium からの制御は include で定義された API 経由で dart runtime に指示
  31. 31. Dartium の binding dartium/src/third_party/WebKit/Source/bindings/dart dartium/src/third_party/WebKit/Source/bindings/v8 Bindings (Dart API) JavaScript V8 Dart VM Dart のページを読み込んだ場合のみ起動 VM の遅延ローディング
  32. 32. 今後の予想  Chrome に Dart VM を搭載するのでは。早ければ 2015 年? WebKit から Blink になりましたし、邪魔する人はいないはず  まずは Oilpan(GC for Blink) でメモリリークを解消してから? http://goo.gl/gCugZ4  ARM + Android 上でも動くため、 モバイルの Chrome にも問題なく搭載できるのでは?  モバイル最速の VM かもだけど、 V8 と Dart VM の同時起動はメモリ食いそう。。

×