◆ 速くなったけど 元が遅かったのが普通の配列と同レベルになっただけ
◆ 変化が起きないことがわかってるので すでに普通の配列より高速だと思ってたけど逆で遅かった

こんな記事を見かけました
https://v8.dev/blog/v8-release-76

V8 のアップデート情報で その中に frozen array の高速化が行われて includes や indexOf などの探索が早くなったというものがあります
frozen だと変化しないことが確定してるから最適化がしやすくなったりするんだろうなーと思ってました

どれくらい変わったのか気になったので実際に試してみたら

Chrome 75.0.3770.90, V8 7.5.288.23
prepare: 219.785888671875ms
normal: 238.075927734375ms
freeze: 1772.533203125ms
normal: 236.906982421875ms
freeze: 1762.966064453125ms
normal: 237.171875ms
freeze: 1758.9189453125ms
normal: 236.230224609375ms
freeze: 1761.4619140625ms

Microsoft Edge 77.0.189.3, V8 7.7.23
prepare: 216.327880859375ms
normal: 236.7548828125ms
freeze: 237.691162109375ms
normal: 239.091064453125ms
freeze: 244.905029296875ms
normal: 240.60498046875ms
freeze: 239.51708984375ms
normal: 237.969970703125ms
freeze: 243.7470703125ms

上が Chrome 75 で V8 バージョンは 7.5 です
高速化のアップデートは 7.6 なので高速化前のものです
下が Edge 77 で V8 バージョンは 7.7 です
7.6 を超えてますが リバートされたりはしてないでしょうし大丈夫でしょう

で 比べてみた結果ですが
速くはなってます……が思っていたものと違いました
これまでの処理で frozen array は遅すぎでした
普通の配列の 8 倍くらいかかっています
それが普通の配列と同じくらいになった というものでした

配列の要素に変化がないことが確定してるのだから 元から普通の配列より高速で それがもっと速くなると思ってたので意外でした
const は使うもののオブジェクトのプロパティまでイミュータブルにはしてないのでそんな遅かったんだと初めて知りました

ともあれ これで普通の配列と同じくらいの速度になったわけですから イミュータブル好きだけどパフォーマンス面で使ってなかったという人でもどんどん使っていけますね

コード

比較に使ったコードです

0 から 999,999 までの数値が入った 100 万の要素がある配列を作ります
それをコピーして freeze させた版も用意します

それに対していくつかの数値を indexOf で探す処理を 100 回繰り返します
下の HTML のページを開くだけです

<script>
console.time("prepare")
const a = [...Array(1000000).keys()]
const b = Object.freeze(a.slice())
console.timeEnd("prepare")

const values = [7, 5000, 9999, 100000, 200000, 500000, 999999]

function measure(name, arr){
console.time(name)
for(let i = 0; i < 100; i++) {
for(const value of values){
arr.indexOf(value)
}
}
console.timeEnd(name)
}

measure("normal", a)
measure("freeze", b)
measure("normal", a)
measure("freeze", b)
measure("normal", a)
measure("freeze", b)
measure("normal", a)
measure("freeze", b)
</script>

(追記)

テンプレートリテラルのタグ関数に渡される配列は frozen なので lit-html/hyperHTML みたいにテンプレートリテラルを活用してるツールを使ってる場合に効果がありそうです