ホーム ] TIPS ] ソフトウェア実験室 ]

上へ
ビットマップの処理速度
色変換速度
数式演算速度
冪乗演算速度
検索速度
文字列処理速度
文字列/数値処理速度
CPU演算速度
TicksとPerformance Counter
文字の数値化
数値化文字の再現
数値化文字の補間
補間の効果
ネイピア数
ネイピア数2
指数関数近似値
級数の収束速度1
級数の収束速度2
級数の精度
逆三角関数を求める
算術幾何平均でπを求める
全フォルダ列挙
ビットマップとメモリリソース
配列とメモリリソース

ソフトウェア実験室

ビットマップの処理速度

最終更新:2007/02/21 全面改訂

 ビットマップのピクセル単位の処理速度を比較する。Get/SetPixel関数は遅いと言われているが、本当かどうか確認するとともに、Marshalクラスによる直接メモリアクセスの実力を知る。

  ●比較・実験方法

 24rgb形式(3バイト/ピクセル)のビットマップ 128 X 128、256 X 256、512 X 512、1,024 X 1,024、2,048 X 2,048 、4096 X 4096 を生成し、以下の方法で、ピクセル単位で特定の色で埋める時の所要時間をmsで計測する。

 言語の違いでは、VB、C#の違いはソースレベルでの記述は異なるが、中間言語ではほぼ同じとなり、実行時はほぼ同じ状態となるので差はない。実際に確認したので、ここでは割愛する。

SetPixel

 VB.NET のマネージドコード、恐ろしく遅いと言われている。

WriteByte

 マーシャルにてビットマップをメモリ上のデータとして扱う。但し、要素のアクセスは専用関数で行う。

配列

 マーシャルにてビットマップをメモリ上のデータとして扱い、そのデータをバイト配列化し、直接アクセスする。最速になると期待できる。

●結果

○処理時間全体

  CPU:ペンティアム4  3.2GHz、メモリ:1024MB、OS:Windows XP Pro SP2
  今回の実験では表示系性能は無関係


 ●考察

  • SetPixelは予想通り遅い。マーシャルのWriteByte、配列によるDirectはやはり速い。
  • 配列版が最も速い。SetPixelの100倍位となっている。これにて、VBによる画像処理も満更ではない。

●注意

 時間計測を、デバッグモードで行うと、.NET関数などはかなり細かなチェックが入るので、実行速度が極端に遅くなる場合がある。SetPixelやWriteByte などは、デバッグモードでは、ピクセル当り、数十μSも掛かってしまう。当初、これに気がつかず、WriteByte がSetPixel より遅く計測され随分と悩んでしまった。

●実験のコード

 ここを参照方。