C# 配列コピーの速度比較

C#の配列コピーには何種類か関数があり、速度も異なる。
UnityではunsafeなMarshal.Copyを使うのは一般的ではないため割愛

Unityでunsafeを使って直接メモリ制御を行う - テラシュールブログ

関数 処理時間[msec]
CopyTo 511
System.Array.Copy 436
System.Buffer.BlockCopy 402

テストコード

const int DATA_SIZE = 10000;
const int TRY_COUNT = 1000000;

void TestRunt()
{
	byte[] byte1 = new byte[DATA_SIZE];
	byte[] byte2 = new byte[DATA_SIZE];

	for (int i = 0; i < DATA_SIZE; i++) {
		byte1 [i] = (byte)Random.Range (0, 256);
	}
		
	System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
	sw.Start ();

	for (int i = 0; i < TRY_COUNT; i++) {
		byte1.CopyTo (byte2, 0);
	}

	sw.Stop ();

	Debug.Log ("CopyTo:"+sw.ElapsedMilliseconds + " ave:" + sw.ElapsedMilliseconds / (float)TRY_COUNT);


	sw.Reset ();
	sw.Start ();

	for (int i = 0; i < TRY_COUNT; i++) {
		System.Array.Copy (byte1, byte2, byte1.Length);
	}

	sw.Stop ();

	Debug.Log ("System.Array.Copy:"+sw.ElapsedMilliseconds + " ave:" + sw.ElapsedMilliseconds / (float)TRY_COUNT);

	sw.Reset ();
	sw.Start ();

	for (int i = 0; i < TRY_COUNT; i++) {
		System.Buffer.BlockCopy (byte1, 0, byte2, 0, byte1.Length);
	}

	sw.Stop ();

	Debug.Log ("System.Buffer.BlockCopy:"+sw.ElapsedMilliseconds + " ave:" + sw.ElapsedMilliseconds / (float)TRY_COUNT);
}