반응형
배열의 값을 복사하는데에는 여러가지 방법이 있다.
일단은 loop를 태워서 직접 copy를 하는 방법이 있고, Array.Copy 또는 Buffer.BlockCopy를 사용하는 방법이 있다.
아래는 성능 평가를 위한 코드를 첨부한다.
static int[,] testArray = new int[800, 600];
static void Main(string[] args)
{
for (int i = 0; i < 800; i++)
{
for (int j = 0; j < 600; j++)
{
testArray[i, j] = 0;
}
}
long ms = 0;
int count = 10;
for (int i = 0; i < count; i++)
{
ms += BaseCopy();
}
Console.WriteLine("base Copy: {0} ms", ms/ count);
ms = 0;
for (int i = 0; i < count; i++)
{
ms += ArrayCopy();
}
Console.WriteLine("ArrayCopy: {0} ms", ms / count);
ms = 0;
for (int i = 0; i < count; i++)
{
ms += BlockCopy();
}
Console.WriteLine("BlockCopy: {0} ms", ms / count);
Console.ReadKey();
}
public static T[,] DeepCopy2dArray<T>(T[,] src)
{
int length = src.GetLength(0);
int width = src.GetLength(1);
T[,] target = new T[length, width];
for (int i = 0; i < length; i++)
for (int j = 0; j < width; j++)
target[i, j] = src[i, j];
return target;
}
public static long BaseCopy()
{
Stopwatch sw = Stopwatch.StartNew();
sw.Start();
for (int i = 0; i < 100; i++)
{
var baseCopy = DeepCopy2dArray(testArray);
}
sw.Stop();
return sw.ElapsedMilliseconds;
}
public static long ArrayCopy()
{
Stopwatch sw = Stopwatch.StartNew();
sw.Start();
int[,] target = new int[800, 600];
for (int i = 0; i < 100; i++)
{
Array.Copy(testArray, target, 800 * 600);
}
sw.Stop();
return sw.ElapsedMilliseconds;
}
public static long BlockCopy()
{
Stopwatch sw = Stopwatch.StartNew();
sw.Start();
int[,] target = new int[800, 600];
for (int i = 0; i < 100; i++)
{
Buffer.BlockCopy(testArray, 0, target, 0, (800 * 600) * sizeof(int));
}
sw.Stop();
return sw.ElapsedMilliseconds;
}
위의 결과는 아래와 같다.
ArrayCopy와 BlockCopy의 경우 오차를 생각한다면 크게 차이는 안나지만 메뉴얼로 복사 했을때와 비교한다면 매우 큰 의미가 있다고 본다.
반응형
'프로그래밍 > C#' 카테고리의 다른 글
[C#] Oracle 연결 시 예외 발생 문제 (0) | 2022.03.11 |
---|---|
[C#] Eager & Short-circuit operators (0) | 2022.02.25 |
[C#] Linq Where Performance Test (0) | 2022.01.26 |
[C#] List에 추가된 구조체의 값 (0) | 2022.01.25 |
[C#] Newtonsoft Json 상속 대상까지 Serialize하기 (0) | 2022.01.18 |