C#でもmemcpy()してみた

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; 
            } 
        } 
    } 
} 

2件のフィードバック

  1. 康ちゃん より:

    処理の内容を考えると、速度差がでるのが不思議~
    バッファ領域の確保で差が出てるのでしょうか?

  2. くまさん より:

    >>康ちゃん さま

    C#じゃと,JITの性能差勝負になるべ
    JITなら,SSE命令も使えるようになるぞー
    (C++は明示的にSSE命令使用をコンパイル時指定せんと,基本はOff@32ビットコンパイル)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください