goo blog サービス終了のお知らせ 

tabstop Annex B

GIMPでイラストを描いていくよ!

SPICE-and-WILMA: とろとろいきたくはありんせん。

2008-05-10 | SPICE-and-WILMA
いつの間にかお絵描きサイトっぽくなくなっちゃってきました(汗

今回はちょっとプログラムなお話。

GW中にパパッと作ってみたWILMAたん。
そのせいか、いまいち描画が速くありません。

その一番大きな理由は、.Net/monoという実行環境にあります。
いまのWILMAは全部がC#で作られていますが、このC#のコードを実行する
.NetやmonoはMMX/SSEといったCPUの高速な機能を使いきれません。
その上、配列をアクセスするといろんなチェックコードが実行されるので
いろいろと遅くなってしまいます。

では、いったいどのくらい遅くなってしまうのでしょうか?
試しにいくつかの方法を作って比べてみました。


(その1)そのままC#で実行 (Normal)

(その2)unsafe+ポインタを使ってチェックコードを省略 (Unsafe)

(その3)unsafeのコードをC言語としてコンパイルして、作ったDLLをDllImportで呼び出し (DllImport)


64x64の画像の合成処理を10000回繰り返す処理を実行して、処理時間を比べてみました。

Trial1: Normal:00:00:08.5716210
Trial2: Unsafe:00:00:06.7957030
Trial3: DllImport(O0):00:00:05.3060760
Trial4: DllImport(O1):00:00:04.0269720
Trial5: DllImport(O2):00:00:03.8205550
Trial6: DllImport(O3):00:00:03.8576090
Trial7: DllImport(MMX):00:00:03.8573070
Trial8: DllImport(SSE):00:00:04.9290220
Trial9: DllImport(SSE2):00:00:05.0308980

さらに、ループを展開してみます。
Trial10: DllImport(O3-2):00:00:03.6345340
Trial11: DllImport(MMX-2):00:00:03.6727230
Trial12: DllImport(SSE-2):00:00:04.9229180
Trial13: DllImport(SSE2-2):00:00:05.0057350
Trial14: DllImport(Intel Compiler):00:00:03.3719240

なんと、C言語で作ったプログラムはC#(Mono)の4割程度の時間で処理を終わります。
頑張って作り込めば、さらに速くなりそうです。

さて、純粋なC#の世界を捨てて泥まみれのC言語づけになるかどうか、迷う所です。

最新の画像もっと見る

2 コメント(10/1 コメント投稿終了予定)

コメント日が  古い順  |   新しい順
Unknown (やまかわ)
2008-05-10 17:28:56
……いずれはGPUのシェーダで描画されるようになると信じて待ってます。
返信する
Unknown (しげっち)
2008-05-10 21:55:43
レイヤ表示は頑張ればGPUでも出来そうですね。
グラフィックスカードが持つメモリが大量になれば問題ないかもしれませんけど、レイヤへの内部のデータの更新はGPUでは難しそうです。

そう考えると、GEGL見たいにラスタデータはただのキャッシュとして扱った方がGPUとの親和性は良さそうです。
返信する

コメントを投稿

サービス終了に伴い、10月1日にコメント投稿機能を終了させていただく予定です。