V8のArray.prototype.flatを最大約5倍速くするまでと、巨大OSSへの大規模コミットの道のり
SessionTrack BJapanese
ある日、Xのタイムラインに「JSCのArray.prototype.flatが速くなる」という投稿が流れてきました。実装を読むと同じ発想がV8にも適用できそうに見え、約1ヶ月後、私のパッチはV8 14.7にマージされました。 Chrome、Node.js、Deno、V8を積むあらゆるランタイムでflatが最大約5倍速くなります。
本トークの主役は最適化そのものです。V8は配列の中身を「整数だけ」「浮動小数点を含む」「穴がある」といったElementsKindと呼ばれる内部型で追跡しており、この型情報を使うと「数値しか入っていない配列にはサブ配列が存在し得ない」ことが自明になり、走査そのものを省略できます。なぜ従来のflatは遅かったのか、メモリ割り当てを1回に減らす2パス方式、holeを詰めるflat特有の仕様との格闘、V8独自言語Torqueでの実装までを順を追って解説します。
v8-devでの提案からGerritレビュー、マージまでの流れも紹介します。マージ翌日にGoogleの自動バグ検知システムClusterFuzzが私のパッチにバグを3件発見してきた顛末も含め、巨大OSSに一個人がコードを差し込む体験を一次情報としてお伝えします。

Yuta Nishi
Platform Engineerとしてプロダクト開発に携わっています。Webが大好きで、特にフロントエンド領域、TypeScriptとV8を愛しています。中でも型パズルとV8の配列領域には強い関心があります。Webの歴史や仕様を追いかけるのも好きです。TSKaigiのスタッフ活動、Zennでの技術記事執筆、各種カンファレンスへの登壇なども行っています。