上記、画像は、「C# ベンチマーク」を実行して計測した結果です。
「C# ベンチマーク」は、当社のFreeソフトです。
Vector株式会社のWebサイトからダウンロードできます。
ダウンロードして使って下さい。
C# ベンチマークのプログラムの内容は、以下の様になっています。
numericUpDown1.Valueに処理回数が入力されています。
private void button1_Click(object sender, EventArgs e)
{
// int[]配列の場合
textBox1.Clear();
int iLen = (int)numericUpDown1.Value;
int[] iDat = new int[iLen];
string sDat = "";
System.Diagnostics.Stopwatch Sw = new System.Diagnostics.Stopwatch(); //ストップウォッチ
Sw.Reset();
Sw.Start();
for (int i = 0; i < iLen; i++)
{
iDat[i] = i;
}
Sw.Stop();
double Tim = (double)Sw.Elapsed.TotalMilliseconds; //ミリ秒を取得
sDat = Tim.ToString("F3"); // 小数点以下第三位まで表示
textBox1.Text = sDat + "ms";
}
private void button2_Click(object sender, EventArgs e)
{
//CString[] 配列
textBox2.Clear();
int iLen = (int)numericUpDown1.Value;
string[] sDatH = new string[iLen];
string sDat = "";
System.Diagnostics.Stopwatch Sw = new System.Diagnostics.Stopwatch(); //ストップウォッチ
Sw.Reset();
Sw.Start();
for (int i = 0; i < iLen; i++)
{
sDatH[i] = i.ToString();
}
Sw.Stop();
double Tim = (double)Sw.Elapsed.TotalMilliseconds; //ミリ秒を取得
sDat = Tim.ToString("F3"); // 小数点以下第三位まで表示
textBox2.Text = sDat + "ms";
}
private void button3_Click(object sender, EventArgs e)
{
// int[] 配列 ポインタ
textBox3.Clear();
int iLen = (int)numericUpDown1.Value;
int[] iDat = new int[iLen];
string sDat = "";
System.Diagnostics.Stopwatch Sw = new System.Diagnostics.Stopwatch(); //ストップウォッチ
Sw.Reset();
Sw.Start();
IntArrayTest(iLen, iDat);
Sw.Stop();
double Tim = (double)Sw.Elapsed.TotalMilliseconds; //ミリ秒を取得
sDat = Tim.ToString("F3"); // 小数点以下第三位まで表示
textBox3.Text = sDat + "ms";
}
unsafe private void IntArrayTest(int ilen, int[] idat)
{
fixed (int* piDat = &idat[0])
{
int* p = piDat;
for (int i = 0; i < ilen; i++)
{
*p = i;
p++;
}
}
return;
}
private void button6_Click(object sender, EventArgs e)
{
// int[] 配列 ポインタ stackallocを使用した場合
textBox4.Clear();
int iLen = (int)numericUpDown1.Value;
int[] iDat = new int[iLen];
string sDat = "";
System.Diagnostics.Stopwatch Sw = new System.Diagnostics.Stopwatch(); //ストップウォッチ
Sw.Reset();
Sw.Start();
IntArrayTest2(iLen);
Sw.Stop();
double Tim = (double)Sw.Elapsed.TotalMilliseconds; //ミリ秒を取得
sDat = Tim.ToString("F3"); // 小数点以下第三位まで表示
textBox4.Text = sDat + "ms";
}
unsafe private void IntArrayTest2(int ilen)
{
// stackallocを使用した場合
int* iDatH = stackalloc int[ilen];
for(int i = 0; i < ilen; i++)
{
*(iDatH + i) = i;
}
return;
}
C#の場合も、やっぱりポインタは早いですね。
C#の処理速度は、MFC(C++)よりも、約10倍遅いと言う結果でした。
MFCを出来るだけarray配列を使って書いた場合は、C#の200倍速いと言う速度計測結果でした。
しかし!! Microsoftは、array配列は使わないでvector配列を使う事を推薦しています。
以上、C#のポインタは本当に早いか?でした。
Comments