Egorovさんの記事やスライド)読んでたのでそれのメモ。この文章は2014年9月13日に書かれて最適化されていないため、この文章を元に最適化をすると失敗すると思います。Developersというのがあるのでこれが分かりやすい。y;}のようなコンストラクタで、これをnewしたインスタンスの形(プロパティの名前、種類とか)が同じなら、プロパティのアクセスが高速になるやつ。cachingというのが多分それだと思います。Classとかは皆知ってると思いますが、実際にどういうケースで最適化が行われないかはIRHydra2で確認するのが簡単で面白いです。IRHydra2mraleph/irhydraIRHydraは、Chrome/V8のデバッグオプションでIR(中間表現)やインライン化等のログを元に最適化がされていない(de-opt)な部分を可視化したり、ディスアセンブリ(コードと並べて表示も出来る)、コントールフローの表示等をしてくれるツールです。この動画でdemoを扱ってるので見ておくといいです。Classの最適化されない事例についてのサンプルコードです。"whatever";loop(v2);というようにv2でVec2の形が.nameによって変化するため、最適化が行われなくなっていることがIRHydra2では可視化されます。CheckMapsというところでpolymorphic(形が多様化)してることが検出されて最適化されてないというメッセージが見られます。実際に途中で形が変わらないように最初からコンストラクタ関数にnameというのを追加してあげるとこのdeoptのメッセージは出なくなります。"whatever";loop(v2);実際に自分で書いたコードを試すには、v8_enable_disassembler=1でビルドしたV8が必要です。v8でv8_enable_disassembler=1したものを作ってインストールしました。使い方はIRHydra2に書いてありますが、v8で以下のようにオプションをつけて実行すると(Chromeもjs-flagで同じような感じ)、hydrogen-34272-1.cfgのようなのと、code.asmというファイルができます。\--redirect-code-traces-to=code.asmこれをInlinedに読み込ませると表示してくれます。v8(d8)の使い方やインストールは以下などを参考にした方がいいと思います。usage最適化とループ上記のdemo-1であえてループを回してる箇所があったのが疑問に思うかもしれません。sum;}自分も最初ループなしで試したいコードを書いたりして以下のようなメッセージがでてcfgとasmファイルが生成されなかったりしてよくわかってなかったです。codeであると認識させるためにループを回してるんだと思います。実行中の関数をJITコンパイルします。いう文章が分かりやすいです。このようなテストのためにループをするコードはどこかで見覚えがあると思います。jsPerfを使ってマイクロベンチマークを取るときに、こういう無意味なループを含んだコードを書いたことがあるかもしれません。何がいいたいかというと、こういうJavaScriptエンジン側の最適化によって取りたいベンチマークとは別の意味になってる可能性があるという話です。いう話が以下の記事で書かれています。ようにコード的には無意味なループを回してベンチマークを取ることがあると思います。このコードがV8でどのように最適化されていって、無意味なベンチになってるかをIRHydra2やEsprimaを使って解析していってます。いう計算を沢山するのを計測したいわけですが、この結果は結局使われていないため、このmultiply(a,b);という部分は無意味なコードとみなされてるかもしれません。(DCE))可能性があります。thlorenz/v8-perf最適化を無効にする方法はありますが、ベンチマークを取りたい時は最適化自体は有効であってもいいと思うので、それが意図したもの以外も最適化されてるケースがあるかもというのが正しいベンチマークを取る難しさかも知れません。APIとかの方が圧倒的なのであまりコードを書くときにこういう最適化は気にしてないです。Deckあたりを見るのがいいと思います。実際にこういうエンジンレベルの最適化を意識してるライブラリ例としてはBluebird、Lo-Dash、Reactなどがありますが、普通の人はこういう事やらないほうがいいと思います。caseに載せるために色々変則的なコードを書いたりしてて、Wikiにもそれらの事についてまとめられています。WikiLo-dashもそういうことのための変更を入れたり、ReactはV8側に最適化のためのコミットをしたりしています。NoteChromium(V8も含む)プロジェクトの最適化周りの変更については以下のページにまとめられているそうです。Projects最初に書いたように自分で理解して、追えるレベルになってからこういう最適化を入れたほうがいいと思います。(自分は興味ないのでやらない)JavaScriptが最適化されるコード書くより、JavaScriptが最適化されないコードを避ける方が方向としてコストに見合うものができるんじゃないかと思います。Egorovさんのブログを読んでて面白かったのでメモっただけの記事です。最近だとthlorenz/v8-perfが広くまとまってるんじゃないかと思います。タグ:JavaScriptV8JIT最適化お知らせ欄JavaScriptに関する最新情報は週一でJSer.infoを更新しています。efcl/efcl.github.ioからご意見下さい関連記事コメントを。