본문 바로가기
Programming/C#

[C#] 배열의 복사 - 어떤게 제일 빠르지? (Buffer.BlockCopy, Array.Copy)

by 타임박스 2022. 3. 28.
반응형


✔ C# 배열 복사

Buffer.BlockCopy 사용법

Array.Copy 사용법

Converting a string array to byte array



 

안녕하세요.

C#에서 배열 복사 방법은 다양합니다. 

그중에서 대표적인게 Buffer.BlockCopy 와 Array.Copy가 있다.

파라미터 정보는 아래와 같다.

- Buffer.BlockCopy(원본배열, 원본배열의 복사 시작위치, 복사될배열, 복사될배열의 시작위치, 복사개수)

- Array.Copy(원본배열, 원본배열의 복사 시작위치, 복사될배열, 복사될배열의 시작위치, 복사개수)

- Array.Copy(원본배열, 복사될배열, 복사개수) - 인덱스 0부터 복사개수만큼 복사함

둘중에서 처리속도는 배열의 크기, 카피범위 size 계산 등에 따라 속도가 그때그때 다르다 -_-;;

Buffer.BlockCopy는 byte 형식의 배열에서만 동작한다.

 

● Buffer.BlockCopy 

1. 사용방법

byte[] a = {1,2};
byte[] b = new string[a.Length];

Buffer.BlockCopy(a, 0, b, 0, a.Length);

foreach(var item in b)
{
    Console.WriteLine(item);
}

 

2. 잘못된 예

▶ 위에서 언급했듯이 byte배열이 아닌 다른형식을 사용하면 에러가 나타난다.

string[] a = {"1","2" };
string[] b = new string[a.Length];

//에러 발생!!!!
Buffer.BlockCopy(a, 0, b, 0, a.Length);

foreach(var item in b)
{
    Console.WriteLine(item);
}

 

"처리되지 않은 예외: System.ArgumentException: 개체가 기본 형식의 배열이어야 합니다."와 같은 에러가 발생된다.

string 배열을 byte의 배열로 변환하고 복사해야한다.

▶ string 배열을 byte의 배열로 변환

string[] a = {"1","2" };
byte[] b = new byte[a.Length];

//Converting string array to byte array
byte[] convert = a.Select(byte.Parse).ToArray();

Buffer.BlockCopy(convert, 0, b, 0, convert.Length);

foreach (var item in b)
{
    Console.WriteLine(item);
}

 

● Array.Copy 사용법

string[] a = {"1","2" };
string[] b = new string[a.Length];

//에러 발생!!!!
//Buffer.BlockCopy(a, 0, b, 0, a.Length);

//오류 안남!!!!
Array.Copy(a, b, a.Length);

foreach (var item in b)
{
    Console.WriteLine(item);
}

BlockCopy에서는 에러가 났던 내용인데 Array.Copy에서는 잘 동작한다.

 

● 결론 

간단하게 생각하면 된다.

BlockCopy나 ArrayCopy나 속도면에서 크게 차이가 나지 않는다.

어떤 부분은 BlockCopy가 빠르고 어떤부분은 ArrayCopy가 빠를때가 있다.

코드 가독성을 고려한다면 이것저것 따지지 않고 ArrayCopy를 쓰는것이 답이다.

개인적인 의견입니다. ㅎㅎ

 

감사합니다.

반응형

댓글