프로그래밍/(도서)C#코딩의기술-실전

[C#] 코딩의기술(실전편) - 3.4 배열 VS IEnumerable<T>

Victory_HA 2022. 3. 31. 22:32

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. 참고