2

.FromImageメソッドで作成されたグラフィックスクラスで、線/円弧を描画するGDI+でいくつかのテストを行いました。

パフォーマンス上の理由から、これをマルチスレッド設定に分割します(いくつかのメソッドを使用したテスト:New Thread(AddressOf..またはParallel.For...またはNewTask ..)これではパフォーマンスが向上しないことに気付きました。 .Graphics.DrawPathルーチンをテストルーチン(例:計算)に置き換えると、マルチスレッドを使用するとパフォーマンスが大幅に向上します(図を参照)。この理由と解決方法は何ですか。

私は4つのセットアップを作成しました:

  1. グラフィックスへの描画:4スレッド(またはタスク)で4x(個別のgraphics.fromimageに40000要素)(時間:1秒76ミリ秒)

  2. グラフィックへの描画:4x(個別のgraphics.fromimageに40000要素)シリアル(時間:959ミリ秒)

  3. 計算:4スレッド(またはタスク)で4x(浮動小数点テスト計算)(時間:672ミリ秒)

  4. 計算:4x(浮動小数点テスト計算)シリアル(時間:2秒189ミリ秒

4

1 に答える 1

2

スレッドセーフな大規模なライブラリは、共有状態を保護するためにロックを使用します。これらのロックはしばしばスレッド間の競合を引き起こし、スレッドは別のスレッドがロックを解放するのを待って行き詰まります。

これがアムダールの法則です。

于 2012-12-07T17:29:02.770 に答える