連想配列速くて感動した
ランキングページ更新の待ち時間が長いので、その対策を考え中。そもそも、なんで時間がかかるかと言うと。
- NNDDはDL済の動画情報(ビデオID)をメモリ上に持っている。
- ランキングを更新するとビデオ100個についてそれがDL済かどうか調べなければならない。
からなのです。
DL済の動画を400個メモリ上に管理しているとします。
今までは、この400個をVector入れて、持っているかどうか先頭から順に探索していました。
つまり、持って居ないかどうか400個調べないと解らない。これを100回繰り返していました。時間かかるよね当然だよね。
連想配列
そんなわけで連想配列を使ってみる事にしました。JavaでいうHashMapです(中身がHashMapと同じアルゴリズムかどうかはわかりませんが)。
実装は長いので省略します。4/21 22時頃の毎日ランキングの100件について、DL済だったかどうか調べるのにかかった時間は以下の通り。(DL済のビデオは400個、MacBookPro 2.4Ghz、MacOS X 10.5、FlexBuilder上でデバッグ中に計測。)
Vectorへの線形探索(1) | 3308ms |
キーを使った連想配列へのアクセス(2) | 34ms |
Vectorを連想配列に変換+(2) | 49ms |
圧倒的すぎるwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
ってわけで導入決定。
連想配列の例
ActionScriptで連想配列を使う例。
var map:Object = new Object(); //連想配列 var video1:NNDDVideo = new NNDDVideo(); //動画の情報を表す var video2:NNDDVideo = new NNDDVideo(); //NNDDVideoオブジェクトを二つ作る map["sm1"] = video1; map["sm2"] = video2; var video:NNDDVideo = map["sm1"]; //video == video1 は true
Javaerな私としては型安全じゃないのは著しく気持ち悪いんですけどね。まあ速いのは重要。今回の場合はmapをprivateにして外に見せないようにしちゃえばまあ良いかなぁ・・・という感じで実装してます。
今後の展望
連想配列のおかげで、ライブラリ完全オンメモリにしないでも済むかもしれません。ファイル管理の柔軟性を残しつつ、「サムネ表示」とか「エコノミーモードでDLしましたよ通知」とか出来るかもしれません(後戻り工程ですけどね!)。
さあ、GWも近づいて来たので連休入る前に次のバージョンのリリースをしたいなぁ。