連想配列速くて感動した

ランキングページ更新の待ち時間が長いので、その対策を考え中。そもそも、なんで時間がかかるかと言うと。

  1. NNDDはDL済の動画情報(ビデオID)をメモリ上に持っている。
  2. ランキングを更新するとビデオ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も近づいて来たので連休入る前に次のバージョンのリリースをしたいなぁ。