いつの間にかお絵描きサイトっぽくなくなっちゃってきました(汗
今回はちょっとプログラムなお話。
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言語づけになるかどうか、迷う所です。
今回はちょっとプログラムなお話。
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言語づけになるかどうか、迷う所です。
グラフィックスカードが持つメモリが大量になれば問題ないかもしれませんけど、レイヤへの内部のデータの更新はGPUでは難しそうです。
そう考えると、GEGL見たいにラスタデータはただのキャッシュとして扱った方がGPUとの親和性は良さそうです。