マルチスレッド描画


下記をマルチスレッド化

SQL Geometryを描画

このためにWriteableBitmapを使用していた。(Lockで簡単)
WriteableBitmapExはマルチスレッド非対応なので,Pixcelsをとるために書き替えてるけど。

X5550 (物理4コア – 8スレッド)
800ms シングル
750ms 2スレッド
730ms 4スレッド
710ms 8スレッド < 既定
730ms 16スレッド

i7-3540M (物理2コア – 4スレッド)
1050ms シングル
980ms 2スレッド
930ms 4スレッド < 既定
950ms 16スレッド

結果は10%程度の性能向上、下記でも書いたように速度向上出来ない例も多いので、それなりか。
データ取得400~600msだとすると描画オンリーではそれなりの向上。
物理コア数で速度変化もあまり見られないので分割向きの処理でもなさそうだが。

時間のかかる計算関連?あまり業務アプリに求められそうにない機能であれば速くできそうだが。
じゃあどんな処理が速くできそう?ってとこは中々難しい、速くなりそうと言ってやってみると意外と処理分割コストが…。
と言うパターンが多い。


並列処理は速度向上の決定打となりうるか?


面倒なのでコードは肝のみ
深いとこは考えてないが、結果はできているように見える。
処理分割する場所によって結果は変わるであろうから高速化できるないし間違いは教えて欲しい。

.NETのみなので非常に楽にマルチスレッド移行ができる、COM混じりだと厳しい。

下記も参考
http://msdn.microsoft.com/ja-jp/library/system.windows.media.imaging.writeablebitmap.lock.aspx

とりあえずLock/Unlock

using (BitmapContext ctx = bitmap.GetBitmapContext(ReadWriteMode.ReadWrite))
{

  bitmap.Clear(Colors.Transparent);

  bitmap.Lock();

  this.DrawTable(extent, width, height, ctx);

  bitmap.AddDirtyRect(new System.Windows.Int32Rect(0,0,width, height));
  bitmap.Unlock();

}

下記を参考にコア数固定で件数分割
http://blogs.msdn.com/pfxteam/archive/2009/06/06/9703059.aspx

ForRange(0, dt.Rows.Count, (from, to) =>
      {
        for (int rowInx = from; rowInx < to; ++rowInx)
        {
          DataRow row = dt.Rows[rowInx];
          SqlGeometry geom = row[shpCol] as
          SqlGeometry;

          if (geom == null || geom.STIsEmpty().IsTrue || geom.STNumGeometries().IsNull)
            continue;

          int numGeom = geom.STNumGeometries().Value;
          if (numGeom == 0)
            continue;

          for (int i = 1; i < numGeom + 1; i++)
          {
            SqlGeometry childGeom = geom.STGeometryN(i);

            if (childGeom == null ||
                childGeom.STIsEmpty().IsTrue)
              continue;

            this.DrawPoints(childGeom, env, width, height, ctx);
          }//end geom loop
        }

      });

FillPolygon部分は、BitmapContextを受け取ってPixelsのみ触るようにして、メインから降りてくるのは全てctx(BitmapContext)に変更
public static void FillPolygon(BitmapContext context, int w, int h, int[] points, int color)

下記から改変移植 ”Unsafeなのでdll分離)
http://writeablebitmapex.codeplex.com/SourceControl/latest#branches/WBX_1.0_WinMD/Source/WriteableBitmapEx/WriteableBitmapFillExtensions.cs

色をIntにするのも別クラスからとって完

カテゴリー: 開発 タグ: , パーマリンク