DartVMのリビジョンログ

リビジョン単位の変更点

RevisionLog32000台

RevisionLog31000台

RevisionLog30000台

RevisionLog29000台

RevisionLog28000台

RevisionLog27000台

RevisionLog26000台

RevisionLog25000代

RevisionLog24000代

RevisionLog23000台

RevisionLog22000台

RevisionLog21000台

RevisionLog20000台

RevisionLog19000台

RevisionLog18000台

RevisionLog17000台

RevisionLog16000台

RevisionLog15000台

RevisionLog14000台

RevisionLog13000台

RevisionLog12000台

RevisionLog11000台

RevisionLog10000台

RevisionLog10000以前


変更点ざっくりまとめ


2014/01

dart 1.1 release

service関連をdart/runtime/vm/serviceに移動し、
そこにservice関連のdartのコードを置いている。
runtime/bin/vmservice/clientにclient用のコードを新規追加。

serviceに以下を追加
code
profile
allocationprofile
coverage

2013/12

2013/12

vmserviceとdebuggerまわりの機能追加が多い。

vmserviceがdart vmがhttp serverを起動して、そこにputで命令を飛ばすと、
jsonで結果が返ってくる。一覧は以下。

"_echo",
"classes",
"cpu",
"debug",
"libraries",
"library",
"name",
"objecthistogram",
"objects",
"scripts",
"stacktrace",

ThreadInterrupterを追加
callbackを登録しといて、sample profilingに使用する。

double型のfieldのload/storeの高速化を行っているっぽい。
fieldをmutableに操作する処理を追加。
fieldのoffsetから、対象のdouble値を直接書き換える。
通常はboxing double / unboxing doubleが間にはいる。

2013/11


branch系の命令の見直しと高速化
Smiの場合、null
Doubleの場合NaNe のケースを考慮

sampling用のProfilerを追加 profile=true

spawnがlocal functionでも可能に。

2013/10

StringInterpolateがvmの組み込み関数になった。
いままでinterpolateはdartのレイヤーでstring array作って結合していたけど、
組み込み関数化されてvmの中、コンパイル時に結合しちゃうぞと。
Stringの操作の最適化が最近活発。

EdgeCounterが埋め込まれるようになった。
isolateのAPIが大きく変わった。
ia32にのみ、Constant Blinding をサポート。jit cookieを使ってxor
ARM softfp calling convention.

2013/09

bugfix, issueの修正が多め

X64の高速化が目立つ。
ARM向けはほぼ修正fixで後はOS待ち?
MIPSは中途半端なところで止まっている?

Box2Dをターゲットに高速化中。

bigintegerのmultiply/divなどを含めて bigintの高速化が多いイメージ

vm/serviceの拡張をかなり頑張っている。
vm/serviceは起動後のdart vmのportに接続して、json形式で情報を取得するインターフェース

polymorphic inliningとrecognizerのチューニングが時々ある。

コミットメンバが1-2名追加、変更ぽい。


2013/08

bugfixが多め

feedback対象にfinal fixed array lengthを追加
feedback用のfieldを追加した。
可能であればbound checkの出力を除去する。

Evaluate expressionが追加。主にdebugger経由で叩けるようになるはず。

組み込み関数の整理も若干
math系の強化
typed_arrayのAPIの強化

javascript_overflow_checkでは、intの値が以下の範囲かチェックする。
((-0x20000000000000LL <= value) && (value <= 0x20000000000000LL));


非最適化の際に、jumpに統計情報を取得する機能を追加し、
最適化の際に、統計情報に応じてreorderする最適化を追加。
reorder_basic_blocks=true

stacktraceの制御を変更したり、exceptionの性能の改善



2013/07

bugやissueの修正が非常に多い。
NoSuchMethodInvocationの高速化 NoSuchMethodのOptionalParameterにも対応

ARMとMIPSは、OSRの実装まで完了。NEONの実装を開始。
ARM NEONを実装

lib/mirror VMのbootstrapのインターフェースがいろいろと修正。

2013/06

MIPS向けの機能追加が多かった。またはMIPS固有の機能追加。
ARM向けはx86と同等のspecでテスト通っているが、IRが追加されていないためまだまだ遅いはず。
MIPS系はあといくつかのテストをpassする必要がある。runtime/vm/vm.status参照。
ia32のunimplが32個あるのに対して、ARM, MIPSは残り75個。40個くらいunimplを埋めると、実装が追いつく。

VMの大きな変更としては、
On-Stack Replacementの追加
throw_on_javascript_int_overflowの追加。53bitを越えて整数演算した場合に例外を投げる。
print object histgram。isolateのshutdown時にlive objectの統計を出力する。
NoSuchMethodInvocationの高速化
Try-Catchを最適化

また各種統計を強化して、adaptiveな最適化を強化したいらしい。
StaticCallをICっぽい処理にして、countをとっている。

runtime/includeのヘッダを分割されたため、
組み込みやnative系はinclude headerを修正する必要がある。

2013/05

stacktraceやsavedcallee系の修正が4月末から多い印象。
editorと連携したdebug関連に手が入っているのだと思う。
特にclosureと連携したcaptureとstackframeとの絡みかな。

object headerが修正されて、freeがなくなって、代わりにrememberedsetが入った。
gcも一緒に修正されて、storebufferがシンプルになった。bufferの重複チェックはrememberedsetを参照する。
gcの際には、objectごとにrememberedsetという状態を持つし、
objectのscan中にはold_object_pointerって状態も管理しているので、
コードはシンプルだけどよくわからん。

あとはType Argumentsの修正が多いかも。
おそらく継承したクラス間でType Argumentsを共通化して重複して格納することを排除している。

HandleがPersistanteHandleとWeakPersistentHandleを追加。
大幅にHandleを使う内部処理をリファクタリングしている。
また、Profileをとって無駄なHandleを削除したり、上記への置き換えが進んでいる。

ARM向けは5月末に大量に修正されている。
ARMではOptimizerが有効になっており、そこそこ動くはず。
intrinsicsの修正は完了。
順調に最適化されたIRが実装されている。
Android Emuで試すか?

前までMIPS向けはARMの1週間遅れだったけど、途中から更新されていないかも。。
MIPS向けをメインでやっていたzra-sanがARM向けも手伝っていそう。


2013/04

ARM対応とMIPS対応の修正が多い。ARM版はクロスコンパイルできるようになった。
ARMのほうが対応が進んでるけど、MIPS対応はARMの1week遅れくらい。
ARMはIRの実装に進んでいる。MIPSもIRの実装に進んでいる。
どちらもStubsとRuntimeの実装。どちらもhello worldまでいけたっぽ。
armの場合、deoptimizeの実装に着手

最近は文字列処理を高速化している最中。
copyの高速化を試してみたい、文字列処理を組込み関数にしてみたり。
latin-1用の高速なパスを追加してみたり。

float/int32x4型は着々と実装が進んでいるみたい。
intel向けには、 レジスタ割付、box/unboxの実装は完了している。
add/mul/sub/div/まで実装された。今後max/minなどの各メソッドを実装するはず。

最近はbugfixやdeprecatedの整理が多、M4がリリースされた。

最近の傾向(2013/03末)

arm assemblerだけでなく、runtimecall, stub, dart frameにもarm向けの実装が進みつつある。
mixinも継続して機能追加中、ほぼ実装完了かな。
最近はStringの高速化を頑張っているみたい。
misp対応も進んでいる。simulatorの機能を実装。
scalarlistからtypeddataに置換。scalarlistはdeprecated
fieldでtype feedbackする仕組みがはいって、Octane系のベンチマークで20%程度スコアアップ
recursive callもinline展開の対象に。

最近の傾向(2013/02末)

arm simulator経由でarm_assemblerのテストが色々と追加されている。
arm simulator経由なので、すべてUnitTestになっている。
mixinが追加されてそこそこ動く。
mixinは、methodとfieldを、mixinされたクラスにaddする機能らしい。
scalarlistとvmの中に、simd128型が追加されて熱い。

最近の傾向(2013/01終)

arm mipsのskeletonを作成完了。中身はunimplだけど、今年中に完了させるのかも。
scalarlistの強化が一通り完了の見込み。
legacy系のサポートは一通り削除。
simulator_armが追加された。
arm_assemblerが追加された。arm portを積極的に推進中みたい。
リビジョンが18000まで進んだ。

最近の傾向(2012/12終)

大きな修正として、MegamorphicInstanceCallや、HeapTracingが入った。
VMの出力するコード(FlowGraphOptimizer)の最適化、
code_generatorの最適化(MethodLookupやMegamorphicInstancCall、ICMiss)、
VM内部のリファクタリングも多いかも。

最近の傾向(2012/12中)

String関連の修正が多かった。サロゲート、Unicode、Latin-1、External対応でかなり手が入った。
あとはHandleScopeの整理やリファクタリングが多いかな。
vegorovが最適化色々追加してるけど、V8と比較して何かってのはない。
parser系の修正に伴い、legacy syntaxの削除もなかなか多い。
ArgumentDescriptorってのが新規で入って(リファクタリング)それ関連の修正も多い。
あとは、mirrorやnosuchmethod系の修正も多いんだけど、理解できていない。

最近の傾向(2012/10末)

発表から1周年、M1がリリースされた。
現在のissueは、M2とM3にタグ付けしているものが多い。
まだまだ仕様面の変更に伴うDartVMの修正がちょくちょくある。

9月後半から10月半ばまで、Web系のイベントが各所であり、
その準備と参加に伴い、コミッタが何名か抜けていた。
10月後半から戻ってきており、パフォーマンスチューニングのfixが増えてきた。

Optimizerへの大幅な機能追加は一通り完了している。
その上で追加が多い項目は、
中間表現の特殊化の追加
DartAPIと連携したintrinsicsのチューニング

その他、以下の項目もおいおい改善されていくのだと思う。
各種check処理がまだまだ多い。arraybound, stackoverflow, argumentcheckなど
RangeAnalysisの解析結果を元に、arrayboundは削除されていく見込み。
また、deoptcheckも少しずつ削除されていくと思う。

メモリアクセス(listの多用)が遅いように感じていたが、
scalarlistを使用すると、大幅に性能向上する。
特にFFTやJacobi系で大幅に向上する。
scalarlistは、unboxedした値を配列っぽくメモリに格納する。

スケールするIntegerの性能向上。SmiとMintに収まれば高速だけど、
BitIntになると大幅に性能低下するので、気をつけたい。
何かprint機能やcheck機能を提案したほうがよいかも。

Stringの操作がV8と比較して遅い。
V8のほうが、マイクロベンチマークで3~4倍速いかな?
そのため、文字列を多用するようなベンチマークでは軒並みV8に負けるのでは?

GCがしょぼい、単純なmark sweepなのはいずれ改善されると思う。
しかしいままでGCに手が入っていないのは、ボトルネックになっていないためだと思う。
DartVMは、特にheap以外のメモリ管理に様々なロジックを使っており、
GC対象を減らす仕組みがすごい。
ボトルネックになっていないのは、マイクロベンチマークや中規模のベンチマークがメインだからかもしれない。
大規模な実アプリケーションが出てこないと、GCは改善されないと思う。

Instrinsicによる各種APIの高速化。
coreのAPIは軒並みIntrinsicsに置き換えていくのだと思う。
特にcoreのAPIなのにPolymorphicInstanceCallが生成されるものは、何かしらの手が入ると思う。

FastPathの追加。
V8にはFastPathという名前のAssemblyチューニングされたIntrinsicsが用意されていた。
同等以上を目指すはず。

おいおい追加されるのは、
ARMへの対応
現在はia32とx64でのみ動作する。
ia32向けのソースコードが今のところ12kline。
V8はia32, x64, arm, mipsに対応しており、機種依存コードがそれぞれ50kline近くあったのと比較すると、非常に少ない。

その他、
methodのcallee/caller間の、inline展開以外の性能向上の余地はあると思う。
この点は改善の余地があるような気がするので、考えてみようと思う。

リビジョンアップのペース


Dartのruntime/vm lib binのリビジョンログを2012/06くらいから追っかけているが、
6月から10月の間に、4000くらい進んだ。2013/01で18000
大体1月に1000くらいコミットされている。かな?

リビジョンの追い方

dartには、trunkとbleeding_edgeが存在します。
trunkは、bleeding_edgeのテストである程度OKもらった単位でmergeされ、DartEditor等と一緒に配布されるっぽいです。※予想


リビジョン単位の比較は、bleeding_edgeを参照します。

性能測定は、trunk単位で行おうと思います。


最近の傾向(2012/10)

M1リリースに向けた仕様改善。仕様面でのDartVMの修正が目立ってきた。

Optimizerへの大幅な機能追加は一通り完了している。
その上で追加が多い項目は、
中間表現の特殊化の追加
DartAPIと連携したintrinsicsのチューニング

性能面での課題もいくつか残っている。
methodのcallee/caller間の、inline展開以外の性能向上の余地は多々あると思う。
各種check処理がまだまだ多い。arraybound, stackoverflow, argumentcheckなど
メモリアクセスを多用すると遅い。
スケールするIntegerの性能向上。SmiとMintに収まれば高速だけど、、
Stringの操作がV8と比較して遅い。
GCがしょぼい、単純なmark sweepなのはいずれ改善されるだろう。
Instrinsicによる各種APIの高速化。
FastPathの追加。V8と同等以上を目指すはず。

おいおい追加されるのは、
ARMへの対応


性能測定は、現在aobenchを使用していますが、
random()が廃止になって、Randomクラスになった結果、
aobenchが9.5secから106secになりました。
代替案として、
aobench(0.1ずつインクリメント)をベンチマークとして採用します!!!

  • 最終更新:2014-02-16 00:19:48

このWIKIを編集するにはパスワード入力が必要です

認証パスワード