,

C#로 배열을 확보한 뒤 dl것을 IEnumerable IReadOnlyList로 받아서 처리할 경우 어느 정도의 속도 차이가 있는지를 측정.

.NET 4.6, x64 환경에서 조사.

 

100000000 요소에서 결과는

Array        87 ms.

IEnumerable  624 ms.

IReadOnlyList 568 ms.

 

속도가 중요한 경우는 IEnumerable 등으로 받아서 내부에서 배열로 캐스트 해서 처리하는 특별 루틴을 넣는 것을 생각해도 좋을듯.

 

 

아래는 테스트 코드:

 

using System;

using System.Collections.Generic;

using System.Diagnostics;

using System.Linq;

 

namespace ColTest

{

  class CollectionSpeedTest

  {

    public static void Main(string[] args)

    {

      var count = int.Parse(args[0]);

      var arr = random().Take(count).ToArray();

      using (new StopwatchHelper("Array"))

        TestArray(arr);

      using (new StopwatchHelper("IEnumerable"))

        TestIEnumerable(arr);

      using (new StopwatchHelper("IReadOnlyList"))

        TestIReadOnlyList(arr);

    }

 

    static double TestArray(double[] arr)

    {

      double sum = 0;

      for (int i = 0; i < arr.Length; i++)

        sum += arr[i];

      return sum;

    }

 

    static double TestIEnumerable(IEnumerable<double> en)

    {

      double sum = 0;

      foreach (var v in en)

        sum += v;

      return sum;

    }

 

    static double TestIReadOnlyList(IReadOnlyList<double> col)

    {

      double sum = 0;

      for (int i = 0; i < col.Count; i++)

        sum += col[i];

      return sum;

    }

 

    static IEnumerable<double> random()

    {

      var random = new Random();

      for (;;)

      {

        yield return random.NextDouble();

      }

    }

 

    class StopwatchHelper : IDisposable

    {

      public StopwatchHelper(string format, params string[] args)

      {

        Console.WriteLine(format, args);

        sw.Start();

      }

 

      public void Dispose()

      {

        sw.Stop();

        Console.WriteLine("{0} ms.", sw.ElapsedMilliseconds);

      }

 

      Stopwatch sw = new Stopwatch();

    }

  }

}

 

 

출처: http://espresso3389.hatenablog.com/entry/2015/11/09/212923

by 흥배 2015.12.14 08:00