関連記事
- 【#PostgreSQL】テーブルから取得したレコードセットをCSVへ落とそうとすると,空ファイルが出来る...ドロドロドロ 【2023年03月08日(水)】
- 【#git】TortiseGit ver2.14のGitWCRev.exeを動かすとErrorCD:10を出力して,動かない 【2023年02月08日(水)】
- 【#Excel】Excel-COMを叩くアプリの改造,オワタ 【2023年01月18日(水)】
- 【#CSHARP】System.Numerics.Vectorでグリングリン,AVXレジスタをぶん回したい 【2023年01月14日(土)】
- 【#PostgreSQL】鬼のような4本のSQLを書き上げた 【2023年01月13日(金)】
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ビットコンパイル)