今このタイミングで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行目の一点.インデックスはあらかじめローカル変数に代入して使うべし.以上.