여기서 중요한 점은 List<T>.Sort()
이 정렬을 수행한다는 것입니다. 목록이 외부 코드에 노출되어 있으면이 코드에 항상 같은 개체가 표시됩니다. 목록이 컨테이너 클래스 외부의 코드에 의해 필드에 유지되는 경우 중요합니다. OrderBy()
으로 정렬하는 경우 이전에 items
을 대체하여 매번 새로운 목록이 생성됩니다. 이전에 저장된 목록은 수업의 현재 상태를 나타내지 않습니다.
성능을 고려하면 OrderBy
은 항목을 정렬하기 위해 전체 목록을 반복해야합니다. 그런 다음 ToList()
으로 호출하여이 목록에서 새 목록을 만들고 두 번째 목록을 반복합니다. 게다가 목록이므로 열거 형은 배가 알고리즘을 사용하여 모든 요소가 들어갈 때까지 크기를 늘립니다. 큰 목록의 경우에는 할당 및 메모리 복사가 상당히 많을 수 있습니다. 나는 성능이 List<T>.Sort()
보다 훨씬 나쁠 것이라고 기대한다.
편집 : 작은 벤치 마크 :
internal class Program {
private static List<int> CreateList(int size) {
// use the same seed so that every list has the same elements
Random random = new Random(589134554);
List<int> list = new List<int>(size);
for (int i = 0; i < size; ++i)
list.Add(random.Next());
return list;
}
private static void Benchmark(int size, bool output = true) {
List<int> list1 = CreateList(size);
List<int> list2 = CreateList(size);
Stopwatch stopwatch = Stopwatch.StartNew();
list1.Sort();
stopwatch.Stop();
double elapsedSort = stopwatch.Elapsed.TotalMilliseconds;
if (output)
Console.WriteLine("List({0}).Sort(): {1}ms (100%)", size, elapsedSort);
stopwatch.Restart();
list2.OrderBy(i => i).ToList();
stopwatch.Stop();
double elapsedOrderBy = stopwatch.Elapsed.TotalMilliseconds;
if (output)
Console.WriteLine("List({0}).OrderBy(): {1}ms ({2:.00%})", size, elapsedOrderBy, elapsedOrderBy/elapsedSort);
}
internal static void Main() {
// ensure linq library is loaded and initialized
Benchmark(1000, false);
Benchmark(10);
Benchmark(100);
Benchmark(1000);
Benchmark(10000);
Benchmark(100000);
Benchmark(1000000);
Console.ReadKey();
}
}
출력 (List.Sort 정규화) : 당신이 언급 한 이후
정렬
List(10).Sort(): 0,0025ms (100%)
List(10).OrderBy(): 0,0157ms (628,00%)
List(100).Sort(): 0,0068ms (100%)
List(100).OrderBy(): 0,0294ms (432,35%)
List(1000).Sort(): 0,0758ms (100%)
List(1000).OrderBy(): 0,3107ms (409,89%)
List(10000).Sort(): 0,8969ms (100%)
List(10000).OrderBy(): 4,0751ms (454,35%)
List(100000).Sort(): 10,8541ms (100%)
List(100000).OrderBy(): 50,3497ms (463,88%)
List(1000000).Sort(): 124,1001ms (100%)
List(1000000).OrderBy(): 705,0707ms (568,15%)
글쎄, 벤치 마크에 표시된 볼륨은 볼륨을 말합니다.그런 속도로 3 개의 OrderBys를 사용하여 한 점을 대체하기 위해 3 가지 종류로 짜낼 수 있으며 하나의 OrderBy를 사용한 것보다 더 나은 성능을 얻을 수 있습니다! Sort()입니다! –
당신의 계산에 의해 판단되는 빠른 후속 조치는 ... 이것은 items.First()가'items [0]'보다 상당히 느리다는 것을 의미합니까? –
아니요,'First()'는'IList'구현에 최적화되어 있으며'list [0]'을 반환합니다. 나는 성과가 같을 것을 기대한다. 열거 형을 직접 사용한다고 할지라도, 여전히 반복 최적화는 단 하나의 항목이므로 마이크로 최적화라고 할 수 있습니다. –