トップ «前の日記(2009-01-16) 最新 次の日記(2009-01-18)» 編集

日々の破片

著作一覧

2009-01-17

_ JavaScriptでMap

えらく遅い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を用意しておけば良さそうだなと気づいた。が、ちょっと時間切れなので後でまたみることにする。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|

ジェズイットを見習え