今回は、C#でなんとなくポインターを使ってみることにする。
ポインターを使うと何がうれしいかを考えてみると、・・・やっぱり速度なのかな?
ということで、
- 配列そのまま
- Enumeratorを使う
- ポインターを使う
の3つで速度検証してみた。
ソース
using System;
using System.Collections.Generic;
using System.Diagnostics;namespace ConsoleApplication1
{
class IndexExecution
{
static public long SumArrary(int[] aArray)
{
long tSum = 0;
for (int i = 0; i < aArray.Length; i++)
{
tSum += aArray[i];
}
return tSum;
}
}
class EnumerableExecution
{
static public long SumArrary(int[] aArray)
{
long tSum = 0;
foreach( int tBuffer in aArray)
{
tSum += tBuffer;
}
return tSum;
}
}
unsafe class PointerExecution
{
static public long SumArrary(int[] aArray)
{
long tSum = 0;
fixed (int* tPointer = &aArray[0])
{
int* ptr = tPointer;
for (int i = 0; i < aArray.Length; i++)
{
tSum += *ptr++;
}
}
return tSum;
}
}
class Program
{
static void Main(string[] args)
{
DateTime tTime;
int[] tIntArray = new int[5000000];
for (int i = 0; i < tIntArray.Length; i++)
{
tIntArray[i] = i;
}
tTime = DateTime.Now;
Console.WriteLine("Index参照");
Console.WriteLine("実行結果 = " + IndexExecution.SumArrary(tIntArray));
Console.WriteLine("所要時間 = " + (DateTime.Now - tTime));
tTime = DateTime.Now;
Console.WriteLine("Enum参照");
Console.WriteLine("実行結果 = " + EnumerableExecution.SumArrary(tIntArray));
Console.WriteLine("所要時間 = " + (DateTime.Now - tTime));
tTime = DateTime.Now;
Console.WriteLine("ポインタ参照");
Console.WriteLine("実行結果 = " + PointerExecution.SumArrary(tIntArray));
Console.WriteLine("所要時間 = " + (DateTime.Now - tTime));
Console.WriteLine("何かキーを押してください。");
Console.ReadKey();
}
}
}出力結果
Index参照
実行結果 = 12499997500000
所要時間 = 00:00:00.1406250
Enum参照
実行結果 = 12499997500000
所要時間 = 00:00:00.0312500
ポインタ参照
実行結果 = 12499997500000
所要時間 = 00:00:00.0312500Index参照が遅いのは当然として、Enumeratorとポインターは同じか。なるほど。
速度が変わらないとすると、ポインターを使うメリットは・・・戻れるとか?
まあ、なにがうれしいかは次の課題として、今回はこんなとこで。
