Firefox3.6 のswitch文がさらに高速になった
「JavaScriptのswitch文のパフォーマンスはブラウザの違いでこんなにも差があった。」でブラウザごとのswitch文の速度評価を行ったが、Firefox3.6のパフォーマンスについて、hacks.mozilla.orgに以下のような気になる記事がある。
JavaScript speedups in Firefox 3.6
Tracing More JavaScript Constructs
... ...
・ switch: We have improved performance when tracing switch statements that use densely packed numeric case labels. These are particularly important for emulators and VMs.
JavaScriptでのエミュレータやVMの実装などでswitch文が高速である必要性を考慮したようだ。まさに、僕が想定していたようなケースである。
本当に高速になったのか、同じテストケースで改めてパフォーマンスを測定してみた。
1. caseが数値リテラルの場合
v | 10 | 100 | 1000 | -1 |
---|---|---|---|---|
Firefox 3.5.6 | 12 | 12 | 12 | 9 |
Firefox 3.6 | 1 | 1 | 1 | 1 |
2. caseが文字列リテラルの場合
v | "s10" | "s100" | "s1000" | "s----" |
---|---|---|---|---|
Firefox 3.5.6 | 2 | 2 | 2 | 2 |
Firefox 3.6 | 2 | 2 | 2 | 2 |
3. caseがvar変数の場合
v | 10 | 100 | 1000 | -1 |
---|---|---|---|---|
Firefox 3.5.6 | 5 | 38 | 7830 | 7850 |
Firefox 3.6 | 5 | 38 | 8040 | 8128 |
4. caseがconst定数の場合
v | 10 | 100 | 1000 | -1 |
---|---|---|---|---|
Firefox 3.5.6 | 12 | 12 | 12 | 12 |
Firefox 3.6 | 1 | 1 | 1 | 1 |
5. caseがvar変数とconst定数が混在する場合
v | 10 | 100 | 1000 | -1 |
---|---|---|---|---|
Firefox 3.5.6 | 8 | 42 | 7940 | 7988 |
Firefox 3.6 | 5 | 39 | 8046 | 8234 |
6. caseの型が混在する定数リテラルの場合
v | 9 | "s10" | 99 | "s100" | 999 | "s1000" | -1 | "s----" |
---|---|---|---|---|---|---|---|---|
Firefox 3.5.6 | 2 | 2 | 2 | 2 | 2 | 1 | 1 | 2 |
Firefox 3.6 | 1 | 2 | 1 | 2 | 2 | 2 | 1 | 2 |
確かに、"densely packed numeric case labels" のとき(上では1と4のとき)高速になっている。
すばらしい。(というか、今まで文字列リテラルの方が定数値より高速だったのだから感覚的には普通になったというべきか)