Más contenido relacionado La actualidad más candente (20) Similar a 2014 dart flight school in Tokyo (20) 2014 dart flight school in Tokyo1. Dart VM の紹介
Outline
Dart VM 1.1
Dart2js 1.1
Dart VM の特長
2014/02/22 Dart Flight School 2014 Tokyo
nothingcosmos <nothingcosmos@gmail.com>
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. Computer Language Benchmark Games
x86 Ubuntu™ Intel® Q6600® one core
Dart / Java7
IO が List<int>
結構遅い
Java なのに GMP 使ってる
BigInteger 同士だと等速
Dart は簡易 regex engine のみ
ブラウザ搭載時に
Irregexp に置き換え
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. 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 っぽい。
9. Dart VM の特長
ここから VM の雑学
JIT コンパイル
Dart VM Architecture と Isolate
Snapshot と高速起動
Message passing と Event Driven
Optional Typing & Generics & Checked Mode
Dartium
10. Dart VM と JIT コンパイル (1)
インタプリタなし、 2 段階の JIT コンパイル
IRHydra がわかりやすい。
http://mrale.ph/irhydra/2/#demo-4
Entrypoint である mainscript を
SingleThreading で
JIT コンパイルしてから実行する
関数呼び出し fibo を見つける
fibo はまだコンパイルしていないため、
fibo 関数を JIT コンパイルする
11. Dart VM と JIT コンパイル (2)
最初の JIT コンパイルは、
どんな型でも動くように汎用コンパイル
型情報の収集を埋込
fibo 関数を JIT コンパイルした後、
fibo 関数の実行に戻る
fibo 関数を再帰的に実行
コンパイル済みの汎用コードを実行する
12. Dart VM と JIT コンパイル (3)
何度も実行される関数は、最適化 JIT コンパイル
収集した型情報を利用し、
型を特殊化してコンパイル、高速に実行可能
fibo 関数を何度も実行すると、
fibo 関数の最適化 JIT コンパイルが走る。
汎用的な fibo から、最適化した fibo に置き換え
Heap が足りなくなったら、
全体の動作を止めて、 GC を実行し、
heap を確保する。
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. 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. 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. Dart VM の特長
ここから VM の雑学
JIT コンパイル
Dart VM Architecture と Isolate
Snapshot と高速起動
Message passing と Event Driven
Optional Typing & Generics & Checked Mode
Dartium
17. Dart Snapshot
Dart VM の object の serialize/deserialize 機能
圧縮率と速度優先
アーキテクチャ非互換 (x86-x64-ARM 間の相互変換は不可能 )
起動の高速化
MessagePassing の際の serialize/deserialize にも使用する。
serialize した object を port 経由で送受信する。
自分の作ったライブラリもあらかじめ snapshot できる。
大体 JSON と同じだけど、追加で VM の内部 object も対象。
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. 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
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. 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)
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. EventLoop And Zone
Zone は RootZone から parent が fork して
木構造でつながる。
scheduleMicrotask で 1Thrad で順次実行
Zone の木構造を辿り実行
zone
root_zone
zone
26. Dart VM の特長
ここから VM の雑学
JIT コンパイル
Dart VM Architecture と Isolate
Snapshot と高速起動
Message passing と Event Driven
Optional Typing & Generics & Checked Mode
Dartium
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. 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. Dart Generics
Class の Reified Generics のみ ( 型パラメータを保存する領域あり )
Generics を使用した場合のみ、 Class のインスタンスを new する際に、
型パラメータを保存する命令を挿入する。
TypeArguments っていう IR が存在する。
型パラメータは、実行時にいつでも参照できる。
Method generics は存在しない。
型パラメータを参照するのは、 checked mode のみ。
Generics の型パラメータも validation される。
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 に指示
32. 今後の予想
Chrome に Dart VM を搭載するのでは。早ければ 2015 年?
WebKit から Blink になりましたし、邪魔する人はいないはず
まずは Oilpan(GC for Blink) でメモリリークを解消してから?
http://goo.gl/gCugZ4
ARM + Android 上でも動くため、
モバイルの Chrome にも問題なく搭載できるのでは?
モバイル最速の VM かもだけど、
V8 と Dart VM の同時起動はメモリ食いそう。。