« Theora のデコードをもっと速く その1 | メイン | Theora のデコードをもっと速く その3 »

2007年11月07日

動画再生エンジン開発日誌:: Theora のデコードをもっと速く その2

    

libtheora そのものに手を加えずに、他に高速化されそうな箇所は、malloc 系と memcpy, memset ぐらいか。
realloc など使われているので、もしかしたら高速化できるかもしれないと呼び出し回数を調べてみる。
malloc, calloc, realloc は合計すると8000回ぐらい呼び出されているようだが、回数が増えるのは最初だけで、以降は変化なし。
realloc は数回しか呼ばれていない。
サイズが 4 とかで呼ばれていたりするのが少し気になるが、途中から呼ばれないとなるとそれほど高速化には寄与しなさそうだ。

--- malloc について脱線
malloc のアルゴリズムにもよるが、malloc は意外と遅い。
まあ、遅いとは言っても、最近のPCではかなりの回数コール ( 数十万回とか数百万回 ) しないとあんまり影響ない。
ただ、サイズ固定でメモリ確保する malloc のようなものと malloc を比べた場合、サイズ固定ならば比較にならないぐらい速い。
この辺りの事について一度書こうと思って、計測結果をメモしていた気がするが見当たらないのでまた今度にする。
--- 脱線終わり

malloc などで確保されるメモリのサイズの偏りを調べて、小さいサイズ用に固定サイズ版 malloc を作ってもいいけど、最初だけじゃあなぁ。
余計なヘッダがつかなくなるのと断片化が回避できそうなのと、キャッシュ効率が上がりそうな気はするけど、それほど速くならない気がするのでここはそのままに。

で、memcpy と memset 。
mplayer のソースを見ると fastmemcpy とかあって、高速化に寄与しそうだと思い少し検索してみると、VC の memcpy などはかなり高速らしい。
Visual Studio をインストールしたフォルダの VC/crt/src/intel の中にソースも入っていると言うことで見てみる。
あきらめた。
memcpy とかはいいや。
たぶん、VC のが速い。

ここまでの結果と比べても、mplayer の方が倍ぐらい速いように見える。
なんだろう。
追いつける気がしない。
VLC の中には libtheora を使っているソースがあるので、libtheora を使っていると思っていたが、libtheora のソースが違うんじゃないのか? と思えてくる。
ソースを見ていて気付いたが、libavcodec の vp3.c の中には theora のデコード用のコードがある。
で、ここを見ると、別に書き起こされたような記述が。
もしかして、こっちが使われている?
と言うことで、libavformat / libavcodec に対応することにした。
で、対応したのだが遅い。
libtheora に比べて半分以下の速度しか出ない。
たぶん、使い方が悪いのだろうと思い、VLC や mplayer のソースを見るがそれほど変わったことをしているようには思えない。
何だろう? よくわからない。

VC2003 から VC2005 に切り替えるとどれぐらい速くなるのだろうと思い、VC2005 でビルドすることにした ( VC2003 のが使い慣れていて使いやすいし、sprintf とかでセキュリティがどうたらとあまりうるさく言わないので、今まで主にVC2003を使っていた ) 。
5% ぐらい速くなった。
速い。
VC2005 の最適化すごいなぁ。
で、以前から気になっていたのだが、VC2005 にはプロファイルをとって最適化する機能がある様子。
メニューの デバッグ → ガイド付き最適化のプロファイル にはよくわからないのが並んでいる。
インストルメントが怪しいということで実行する。
ビルドされた。
次に「インストルメントまたは最適化されたアプリケーションの実行」をしてみる。
アプリが起動した。たぶん、ここで実際に使うのだろうとデコードしてみる。
終わった後、アプリを終了して「最適化」を実行してみる。
何か最適化されたものができたっぽい。
実行してみる。
10% ぐらい速くなった!
すげー。プロファイルを使った最適化すごい。
勘で使ったんだけど、問題なかったようだ。
で、これで Athlon マシンで比較してみる。
かなり肉薄している気がする。
Core 2 Duo の方ではまだまだだけど。
でも、やはり libtheora なのかなぁと思い始めた。
後、VC2005 は積極的に使ったほうが良さそうだと思った。

まだつづく。



投稿者 Takenori : 2007年11月07日 03:32




comments powered by Disqus
Total : Today : Yesterday : なかのひと