関連記事
- 【#CSHARP】ソリューション内でサービス,Winformアプリを混在で作成させ,バイナリ出力先を同じにするとサービスが起動しない 【2024年02月08日(木)】
- 【#PHP】謎な #Laravel 案件 引き渡したじ 【2024年01月11日(木)】
- 【C#】謎な改造アプリ,SIMD命令を導入して高速化しようか,思案中 【2023年11月14日(火)】
- Javaの”やらかし”でC#と人気逆転か 激変プログラミング言語人気ランキング 【2023年10月18日(水)】
- 【#CSHARP】次の案件のスケルトン書いてgitサーバに登録するなどと 【2023年05月16日(火)】
2006年10月17日 20時58分 旧ブログより
memcpy()のC#版での性能テスト
いや、実際は、memcpy()じゃなくて、Array.Copy()命令なんだが(w
前回のC++版をC#に書き直してみました
条件は以下のとおり
CPU : AMD Athlon64x2 3800+(2.0GHz)
Memory : 1GB
OS : Windows XP Pro
C++ : Visual Studio 2005(C#2.0) + .Net FrameWork2.0
画像データ2000回の Array.Copy()を実行 |
リリースコンパイル |
DVサイズ 720 * 480 32ビットピクセル (1.3MB) |
2,891ミリ秒 (956,347 B/ms) |
ハイビジョンサイズ 1280 * 960 32ビットピクセル (4.8MB) |
10,172ミリ秒 (966,417 B/ms) |
ほんのちょっぴりC++版より遅い感じ
開発コストは、比べ物にならないくらいC#のほうが、低いし
C#でも、安心して画像処理できる、はず?(w
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace memcpy { public partial class Form1 : Form { private const int DUMMY_WIDTH = 1280; private const int DUMMY_HEIGHT = 960; private const int DUMMY_DEPTH = 4; private const int DUMMY_BUFLEN = DUMMY_WIDTH * DUMMY_HEIGHT * DUMMY_DEPTH; byte[] buf1; byte[] buf2; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { buf1 = new byte[DUMMY_BUFLEN]; buf2 = new byte[DUMMY_BUFLEN]; try { DateTime dt = DateTime.Now; int min = dt.Minute; int sec = dt.Second; int mili = dt.Millisecond; label1.Text = min.ToString() + "_" + sec.ToString() + "_" + mili.ToString(); for(int i = 0; i < 2000; i++) { Array.Copy(buf1, buf2, DUMMY_BUFLEN); } dt = DateTime.Now; min = dt.Minute; sec = dt.Second; mili = dt.Millisecond; label2.Text = min.ToString() + "_" + sec.ToString() + "_" + mili.ToString(); } catch { } finally { buf1 = null; buf2 = null; } } } }
処理の内容を考えると、速度差がでるのが不思議~
バッファ領域の確保で差が出てるのでしょうか?
>>康ちゃん さま
C#じゃと,JITの性能差勝負になるべ
JITなら,SSE命令も使えるようになるぞー
(C++は明示的にSSE命令使用をコンパイル時指定せんと,基本はOff@32ビットコンパイル)