2019/03/11

簡単に高速化できる方法

ネットワーク上のファイルに対して読み書きするとHDD上と比べてすごく遅くなります。

というわけでメインマシンから鯖上のファイルをエンコードするとき、無音検出に使っているfaad(mod)がやたらと遅いのが気になったのでソースから再コンパイルして調整してみました。

DGIndexの高速化で使ったsetvbufが手っ取り早いんじゃね?と思ったので適用。
 setvbuf(*FILE, NULL, _IOFBF, 131072);
とか書くだけです。


ネットワーク(SMB)上に144kbps、2chのAACを用意して、-b2で24bit出力(入力と出力は同じ鯖の同じフォルダ)したときの結果です。
入出力バッファ無し時は配布版の2.7modとも同じ速度でした。

入力バッファ 出力バッファ 速度 -b2
- - 38.15x
64kB - 38.0x
- 8kB 81.60x
- 64kB 246.17x
- 1MB 324.98x
- 2MB 346.40x
- 4MB 348.47x
- 6MB 347.47x
16kB 1MB 331.54x
64kB 1MB 334.42x
128kB 1MB 323.18x
16kB 2MB 323.18x
32kB 2MB 334.36x
64kB 2MB 343.31x
128kB 2MB 346.40x
256kB 2MB 346.40x
512kB 2MB 341.30x
1MB 2MB 347.47x
8kB 4MB 344.36x
64kB 4MB 349.55x
128kB 4MB 346.47x

という感じで、僕のネットワーク環境下では入力128kB、出力2MB位がちょうどよいようです。
入力にバッファが効かないのはOSでキャッシュされているから疑惑もありますが・・・
RAMMap等でクリアしても良いのですが、今回はそこまでしてません。

HDD上のファイルに対してもorg373x→486x位に早くなりました。
但し、オリジナル配布版とはlibが異なるのか、デコードしたwav同士を比較するとたまに1digit異なったりします。元々浮動小数なので気にしなくて良いのですが。

2 件のコメント:

  1. もしよろしければソースを公開していただけませんか?

    返信削除
    返信
    1. コメントに気付きませんで申し訳ありません。
      とは言ってもほとんど何も変えてないので差分だけ

      audio.c
      84a85
      > setvbuf(aufile->sndfile,NULL,_IOFBF,1048576*2);

      main.c
      282a283
      > setvbuf(b->infile,NULL,_IOFBF,131072);

      ・・・ほんとにほとんど変わっていないでしょ?(w

      削除