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