今このタイミングでFlash10のVectorの挙動について書くのは100%遅い.
自分にとってプログラムは趣味であって,仕事は全く関係ない事をやっている人なので,仕様が安定していない最新技術とかにはあんまり興味が無くて,ある程度成熟して固まってきたところで乗っかる事で,覚えることを極力最小化したいタイプなんですが.
さて,今までコソコソとやってきてた事は,FlashPlayer10を想定しつつFlashPlayer9で動くように作ってて,FP10が正式リリースされるタイミングで移行しようかな,と考えていました.が,だんだんと形になって来るにしたがって,FP9上で動かすのに限界が出てきたので見切り発射でFP10を導入しました.
で,せっかくなのでid:keim_at_Si:20080528と同じ事をFP10上でVectorも追加してやってみました.
int vector テスト for FlashPlayer10
デバッガの結果. Windows XP/StandAlone/WIN 10,0,0,525/debugger 770[ms] { array[i] += t1; } 827[ms] { array[i] = array[i] + t1; } 973[ms] { array[i] = int(array[i]) + t1; } 469[ms] { t0 = array[i]; t0 += t1; array[i] = t0; } 431[ms] { t0 = array[i]; t0 = t0 + t1; array[i] = t0; } 562[ms] { t0 = array[i]; array[i] = t0 + t1; } 646[ms] { array[i] = array[i + t1]; } 352[ms] { t0 = i + t1; array[i] = array[t0]; } 147[ms] { vector[i] += t1; } 136[ms] { vector[i] = vector[i] + t1; } 524[ms] { vector[i] = int(vector[i]) + t1; } 145[ms] { t0 = vector[i]; t0 += t1; vector[i] = t0; } 147[ms] { t0 = vector[i]; t0 = t0 + t1; vector[i] = t0; } 150[ms] { t0 = vector[i]; vector[i] = t0 + t1; } 519[ms] { vector[i] = vector[i + t1]; } 150[ms] { t0 = i + t1; vector[i] = vector[t0]; }
ie上での結果. Windows XP/ActiveX/WIN 10,0,0,525/normal 703[ms] { array[i] += t1; } 687[ms] { array[i] = array[i] + t1; } 500[ms] { array[i] = int(array[i]) + t1; } 391[ms] { t0 = array[i]; t0 += t1; array[i] = t0; } 391[ms] { t0 = array[i]; t0 = t0 + t1; array[i] = t0; } 500[ms] { t0 = array[i]; array[i] = t0 + t1; } 578[ms] { array[i] = array[i + t1]; } 343[ms] { t0 = i + t1; array[i] = array[t0]; } 140[ms] { vector[i] += t1; } 125[ms] { vector[i] = vector[i] + t1; } 125[ms] { vector[i] = int(vector[i]) + t1; } 125[ms] { t0 = vector[i]; t0 += t1; vector[i] = t0; } 125[ms] { t0 = vector[i]; t0 = t0 + t1; vector[i] = t0; } 125[ms] { t0 = vector[i]; vector[i] = t0 + t1; } 485[ms] { vector[i] = vector[i + t1]; } 140[ms] { t0 = i + t1; vector[i] = vector[t0]; }
firefox上での結果. Windows XP/PlugIn/WIN 10,0,0,525/normal 698[ms] { array[i] += t1; } 703[ms] { array[i] = array[i] + t1; } 499[ms] { array[i] = int(array[i]) + t1; } 393[ms] { t0 = array[i]; t0 += t1; array[i] = t0; } 399[ms] { t0 = array[i]; t0 = t0 + t1; array[i] = t0; } 510[ms] { t0 = array[i]; array[i] = t0 + t1; } 530[ms] { array[i] = array[i + t1]; } 347[ms] { t0 = i + t1; array[i] = array[t0]; } 129[ms] { vector[i] += t1; } 128[ms] { vector[i] = vector[i] + t1; } 124[ms] { vector[i] = int(vector[i]) + t1; } 127[ms] { t0 = vector[i]; t0 += t1; vector[i] = t0; } 127[ms] { t0 = vector[i]; t0 = t0 + t1; vector[i] = t0; } 131[ms] { t0 = vector[i]; vector[i] = t0 + t1; } 475[ms] { vector[i] = vector[i + t1]; } 142[ms] { t0 = i + t1; vector[i] = vector[t0]; }
...うん,今はっきりと判った.自分は技術革新が嫌い.一生懸命チューニングしても,こうやって一瞬で無に帰する.やってらんねー.ってか,こういうのはもっと早くから導入してください.
って感想はともかく,今回の試験は「不変のローカル変数,シンプルなインクリメントによるアクセス」で極端な最適化がかかってる可能性が有るので,一概にVectorスゲーArrayオワターとは言い切れないものの,FP10はVectorの時代だなーとは感じさせる結果ではあります.
Vectorでのポイントは15,16行目の一点.インデックスはあらかじめローカル変数に代入して使うべし.以上.