2010年10月1日金曜日

[.NET]いまさら?Parallel.Forを使ってみた(その2)

先日実験していました、マルチスレッドの件で、いかにして高速化するかを検討してみたんですが、同期化するオブジェクトを分けるというアイデアを思いつきついたので、実行してみました。
で実験の結果、5回計測で14.420秒となり、約13%の性能向上しました。しかしメモリは画像サイズ分増加します(がいまどきのH/Wであれば知れていますね)。

プログラム言語であるC#にも簡単にマルチスレッドを扱うような機構が用意されており、便利になった反面、マルチスレッドに関する知識もある程度必要と実感しました。
これからのCPUはMoreからManyになる。そういわれています。もっと勉強していかないとね。

で、コードはこんな感じ。

private void btnGlay2_Click(object sender, EventArgs e)
{
    textBox1.Text = "グレースケール化(2)";

    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
    sw.Start();

    Bitmap bmp = new Bitmap(ctlPicture.Image);
    int h = bmp.Height;
    int w = bmp.Width;
    Parallel.For(0, w, delegate(int i)
    {
        for (int j = 0; j < h; j++)
        {
            Color color;
            lock (bmp)
            {
                color = bmp.GetPixel(i, j);
                // 計算式にて、値を算出してセットする
                //int col = (int)(color.R * 0.299 + color.G * 0.587 + color.B * 0.114);
                //int col = (int)((color.R + color.G + color.B) / 3);
                int col = (int)Math.Round((color.R + color.G + color.B) / 3.0d);
                Color pix = Color.FromArgb(col, col, col);
                bmp.SetPixel(i, j, pix);
            }
        }
    });
    ctlPicture.Image = bmp;

    sw.Stop();
    textBox1.Text = String.Format(textBox1.Text + " 完了{0:#,##0}ms", sw.ElapsedMilliseconds);
}

0 件のコメント: