著作一覧 |
えらく遅いWebアプリケーションがあり、遅いのはRDBとのインターフェイスが重いのだろうと思っていた。
仕事で、それのUIをちょっと変えた場合の紙芝居を作ることになり、ライブ状態でソースを取り出して元ネタ作って、それを組み合わせて、結構JavaScript使っているなぁと思いながら、面倒なので静的HTMLにせずにそのままJavaScript使うようにして作り終えて動かしてびっくり。
遅い。そのページのレンダリングに数秒かかる。紙芝居なのに。
なんでこんなに遅いんだろうと、しょうがないのでまじめにソースを読んで、とりあえずループの中で文字列を結合しまくっているのを見つける。
for (i = 0; i < x.length; i++) { str = str + x[i]; }もしかしたら、こいつを配列にしたらどうか? と
for (i = 0; i < x.length; i++) { a.puth(x[i]); } ... a.join('');にしたら、気持ち速くなったようだが、決定打ではない。
で、ふと気づくと、new Map()というのがやたらとある。はて? JavaScriptにMapなんて無いはずだが。
で、その実態が、Scripting.Dictionaryで、それをActiveXObject.newしているのに気づく。どう見積もってもこれを4桁個は生成している。
良く見ると単なるペアが多数あることに気づいて、それは単なるObjectに毛をはやしたやつに変えてみる。function Mapとなっていて生成処理がカプセル化されていたので、newするところを別のfunctionに変えてやれば良いので、遅くはあるが、元の設計そのものは悪くないな、と気づく。
数秒から一呼吸程度に速くなったので、効果があることがわかる。
残ったやつをどうするか、考える。Objectは連想配列なんだからそのまま使えば、ActieXObjectのCoCreateInstanceによるオーバーヘッドをゼロにできる。
しかし、keysに相当する処理を使いたいのだということがわかる。というか、そのためにVBArrayまで利用している(ToArrayの結果を取るためだ)。
キーだけ別途にObject内にArrayを用意しておけば良さそうだなと気づいた。が、ちょっと時間切れなので後でまたみることにする。
ジェズイットを見習え |