프로그래밍/C#

[C#] 배열 복사 성능 평가

흔한티벳여우 2022. 2. 8. 17:26
반응형

배열의 값을 복사하는데에는 여러가지 방법이 있다.

일단은 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의 경우 오차를 생각한다면 크게 차이는 안나지만 메뉴얼로 복사 했을때와 비교한다면 매우 큰 의미가 있다고 본다. 

반응형