1. 임의 접근
- 임의 접근 (random access) : 순서에 관계 없이 사용할 수 있다. 갑자기 마지막 데이터를 달라고 요청할 수 있습니다.
- 순차 접근 (sequential access) : 앞에서부터 차례대로 사용한다. 갑자기 마지막 데이터를 꺼내서 사용할 수 없다. 처음부터 순서대로 나열됩니다.
- 배열은 임의 접근이 가능합니다.
- IEnumerable(열거 인터페이스)는 임의 접근 하지 않습니다. 순차 접근만 가능합니다.
- ElementAt(), ElementAtDefault() 메서드를 사용하면 인덱스 번호를 지정하여 임의 접근할 수 있는것 처럼 보일 수 있지만, 그것은 착각이다.
1.1 사용 예제
- 예제에서 처리시간만 두고 비교하면 배열의 처리 시간이 더 빠릅니다.
- 임의 접근을 해야 할 때는 배열을 사용하는게 유리합니다.
static void Main(string[] args)
{
int size = 1000000;
int count = 100000000;
var ar = new int[size];
ar[size - 1] = 999;
var start1 = DateTime.Now;
for (int i = 0; i < count; i++)
{
var n = ar.ElementAtOrDefault(size - 1);
}
Console.WriteLine(DateTime.Now - start1);
var start2 = DateTime.Now;
for (int i = 0; i < count; i++)
{
var n = ar[size -1];
}
Console.WriteLine(DateTime.Now - start2);
Console.ReadKey();
}
1.2 실행결과
2. 자유도와 필요도
- 배열은 열거 인터페이스보다 빠릅니다.
- 하지만, 배열을 만드는 시간도 고려해야합니다.
2.1 사용예제
- 열거 인터페이스를 사용하면 배열의 요소를 나열하는 작업을 중간에 멈출 수 있습니다.
- 열거 인터페이스를 사용해서 첫 번째 요소를 가져오고, 처리를 멈춥니다.
- 두 번째 요소는 가져오지 않습니다.
- 다만, 두 번째 요소를 가져올 때는
순차 접근
을 하기 때문에 ToArray()사용 할 때와 처리 시간이 비슷할 수 있습니다.
- ToArray()는 배열을 생성합니다.
- 배열은 데이터가 전부 존재해야 합니다.
- 열거 객체를 사용하지만 ToArray()가 모든 요소를 만들고, 시간이 더 오래걸리는 것입니다.
class Program
{
private static IEnumerable<int> enumSample()
{
yield return 1;
Task.Delay(1000).Wait();
yield return 2;
}
static void Main(string[] args)
{
var start1 = DateTime.Now;
var q = enumSample();
var r1 = q.First();
Console.WriteLine(DateTime.Now - start1);
var start2 = DateTime.Now;
var ar = enumSample().ToArray();
var r2 = ar.First();
Console.WriteLine(DateTime.Now - start2);
Console.ReadKey();
}
}
3. 정리
- 배열, 열거 인터페이스 어느 쪽을 사용하든 속도가 느려질 가능성은 있습니다.
- 단, 열거 인터페이스를 사용하는 것이 더 낫다는 경우가 더 많습니다.
4. 참고
'프로그래밍 > (도서)C#코딩의기술-실전' 카테고리의 다른 글
[C#] 코딩의기술(실전편) - 3.7 Cast VS OfType (0) | 2022.03.31 |
---|---|
[C#] 코딩의기술(실전편) - 3.5 짧은쿼리 VS 긴 쿼리 (0) | 2022.03.31 |
[C#] 코딩의기술(실전편) - 3.3 OrderBy VS Sort (0) | 2022.03.31 |
[C#] 코딩의기술(실전편) - 3.2 First VS Single (0) | 2022.03.31 |
[C#] 코딩의기술(실전편) - 3.1 First와 FirstOrDefault (0) | 2022.03.31 |