ドナドナされるプログラマのメモ

Windows用アプリのプログラミングメモ

mozjpegをつかった画像変換ソフトの開発 その4

どのようにマルチスレッド化するかを考え中。

考えられる方針は大きく2つ。

  1. ファイルを1個開くたびに1スレッド作り、1変換をするたびに1スレッドを作り、1個書き出すたびに1スレッド作る。ブルジョワ方針。
  2. 物理メディアごとに1スレッド作り、当該メディアで読み書きするファイルはすべてそのスレッドで処理。CPUコアごとに1スレッド作り、当該コアで処理するデータは(略)。けちんぼ方針。

2.のほうがかっこいい実装だし、スレッドの生成はリソースを食うので極力しないほうがよい。一方、この実装は面倒でもある。そこで、2.の実装が努力に値するのか軽く検討してみた。

今回のソフトは、とにかく大量の画像を変換することを目標にしている。そのため、処理の速さは大事な指標だ。そこで、2.の実装によりどのくらい処理が早くなるかを考えてみた。もしとても早くなるなら、努力に値するはずだ。

1.の方法で生成するスレッド数は、画像ファイル数の3倍。なので1万ファイルを処理するならば3万スレッドほど生成することになる。一方、スレッドの生成にかかる時間はかんたんなテストの結果368.8us程度 @ Ryzen7 3700Xだった。ということは、1.の方式では368.8×10^-6 × 3×10^4 = 1106.4×10^-2 ≒ 11秒ほど遅くなるのか。

f:id:donadonasan:20200204001514p:plain

スレッド生成にかかる時間の計測結果 @ 10000サンプルの平均

1ファイルあたりにかかる合計処理時間が1秒だとすると、処理時間が0.1%ほど伸びる計算だ。これは誤差だなあ。2.は手間がかかる割に早くないようだ。というわけで1の方式にする。