ライブラリ性能改善中

非難の的であったNNDDのライブラリのもっさり具合。
v1.25.0ではこれの改善を目指しています。

実現方式

ライブラリの何が重いかというと、指定されたディレクトリ内の項目を、一覧に表示する処理が重いのです。(特に、表示するムービー一覧を探すのが。)

従来方式

指定されたディレクトリ内の項目の全項目をファイルシステムから取得し、その中からflv、mp4、swfを線形探索し、抽出します。(swfの場合はニコ割を除外する処理が入ります。)
すべてのファイルに対して、flvか、mp4か、swfかを確認する処理が必要になります。

  • 利点:表示のタイミングでファイルシステムとライブラリの表示の同期が取れる。
  • 欠点:表示のたびにファイルシステムにアクセスが必要。ファイルの一覧から動画を抽出するのに時間がかかる。
新方式

NNDDが内部的に管理している(library.xmlに登録されている)動画の一覧をメモリ上に保持しておき、指定されたディレクトリに保存されている動画を線形に探索し、抽出します。基本的には管理済み動画すべてに対して保存先ディレクトリパスに対する比較処理が1回(もしくは2回)必要になります。

  • 利点:表示のたびにファイルシステムにアクセスしなくてよい。抽出対象が動画ファイルであるかどうかを確認する必要がない。
  • 欠点:ファイルシステムとライブラリの表示で同期が取りづらくなる。(同期を行う更新処理が別途必要になる)

実測

探索対象の動画は250ムービー。ディレクトリ内には動画ファイル以外にもコメント、投稿者コメント、サムネイル情報、サムネイル画像、市場情報が存在します。(存在しない物もあります。)そのため、実際のディレクトリ内の項目数は約1,100項目。また、library.xmlに登録されている動画は750ムービー。
上記条件で実測してみました。*1

方式 かかった時間 探索対象項目数
従来方式 550ms 1,100ファイル
新方式 120ms 750ムービー

また、かかった時間のうち、100msは一覧表示用オブジェクトの構築処理にかかっています。なので、純粋にファイルの探索にかかった時間は、

方式 かかった時間...(1) (1)-構築処理時間...(2)
従来方式 550ms 450ms
新方式 120ms 20ms

つまり、新処理の方が最大22.5倍高速*2である事がわかります。
体感速度的にも約4.5倍高速です*3

早くならないパターン

探索対象ディレクトリ内のムービーの件数よりも、library.xmlに登録されているムービーが圧倒的に多い場合、上記ほどの速度向上が期待できない(むしろ遅くなる)場合があります。
上記各方式における各ファイルごとの処理時間は、

  • 従来方式:550ms / 1,100項目 = 0.4ms/項目*4
  • 新方式:120ms / 750項目 = 0.16ms/項目

例えば、10,000件以上のムービーを100以上のフォルダに分割して保存しているようなパターンです。各フォルダには100個のムービーを含む400個のファイルが存在するとしましょう。
この場合、従来方式では400個のファイルを比較するだけですみますが、新方式だと10,000個のファイルを比較する必要があります。それぞれの項目選択から表示完了までの時間は、

  • 従来方式:400項目 * 0.4ms + 100ms = 160ms + 100ms = 260ms = 0.26s
  • 新方式:10,000項目 * 0.16ms + 100ms = 1,600ms + 100ms = 1,700ms = 1.7s

このパターンだと新方式の方が従来方式よりも6.5倍遅くなります。
メモリ中に保持するlibrary.xmlに登録済み動画を線形に保持するのではなく、ディレクトリ構造と同じように階層で管理すれば事態は改善される気がしますが。さて、自分で2分木的なものを実装するのか・・・?

そんなわけで、次期バージョンのリリースはもう少し先になりそうです。

*1:マシン構成:Core2Duo 2.4GHz、メモリ4GB、Mac OS X 10.6.3、Adobe AIR 1.5.1

*2:従来方式の(2)/新方式の(2)

*3:従来方式の(1)/新方式の(1)

*4:ファイル一覧取得にかかる時間と抽出にかかる時間の割合が一定と仮定