WPF、Parallel.Invoke、並列実行は昨日より速く
昨日の続き
目的は昨日と同じで画像処理を考えて、RGB順に並んだbyte型配列から、RGBそれぞれの配列を作成、それぞれの最小値、最大値、平均値(double型)を求める

結果

一番上が昨日、一番下が今回最速で
昨日より2倍くらい速くできた
今回のアプリのダウンロード先
CPU使用率

録画で20%くらい使っていて3コアCPUなので
100%使い切ってもアプリ単体だと最大でも80%
いくつか試した中で一番速くできた方法は
RGBごと別々の処理を書いて、それをParallelクラスのInvokeで同時実行
RGB配列からRの配列作成と最小値、最大値、平均値を求める

これは昨日の普通に書いたTestAをRだけの処理にしただけ
GとBのぶんも書いて

違うのは結果を入れる変数が違うのと
forの開始インデックスが違うだけ(491,508行目)
あとはこの3つをParallelクラスのInvokeで同時実行する
TestD
1行で書くと
改行入れるとこう?
ここ見てなんとなくできるようになった
Parallel.Invoke素晴らしい
これで昨日より2倍くらい速くできたけど、RGB3つの処理がほとんど同じなのでムダな気がする、1つにできないかなと思ってできたのがこれ
引数にrefを付けないとうまく動かないのがめんどくさい
これをParallel.Invokeで実行する
TestC

こっちは確実にめんどくさくなった
これで速くなればよかったんだけど
結果は
グラフで比較

TestA~D、PはParallelのP、Oldは以前の方法
LINQを使ったB、BPが遅いのがわかる
B、BPを外して比較

500万になると差が開いた
それにしてもOldから比べるとずいぶん速くなった
今回のアプリ

メモリの使用量が多すぎなので一部のボタンは無効化してある
チェック入れると有効になる
RGBそれぞれになるので、この3倍になる
メモリ使用量

これくらいなら平気
500万だと

これが1000万だと1GB以上になって
メモリ搭載量8GBのPCだときつい
8kの3300万…「それ以上いけない」
処理が終わったあとも何故かメモリを開放してくれない

150MBも掴んだまま
処理終了2分後くらい
デバッグ時とリリースバージョン

昨日の記事はデバッグで計測、今日の比較はリリースバージョン
参照したところ
連載! とことん C#: 第 32 回 並列 (Parallel) で行こう 言語: C#
https://code.msdn.microsoft.com/windowsdesktop/32-Parallel-af4950ae
ギットハブ
関連記事
前回は昨日2018/11/30
LINQのMin、Max、Average使ってみたけど遅い、画像処理には向かない ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/gogowaten/15774616.html