2016-06-16 2 views
0
의 성능 테스트에서 가져온 다음과 같은 결과를 설명

나는 다음과 같은 시험은 내가내가있는 OrderBy

using System; 
using System.Linq; 
using System.Collections.Generic; 
using System.Diagnostics; 

public class Program 
{ 
    public static void Main() 
    { 
     double[] avgs = new double[100]; 
     int tests_per_size = 1000; 
     Random rnd = new Random(); 
     Stopwatch stpw = new Stopwatch(); 
     for(int i = 1; i <= avgs.Length; ++i) 
     { 
      double sum = 0; 
      int[] arr = new int[i]; 
      for(int j = 0; j < tests_per_size; ++j) 
      { 

       for(int k = 0; k < arr.Length; ++k) 
        arr[k] = rnd.Next(Int32.MinValue, Int32.MaxValue); 
       stpw.Start(); 
       var slist = arr.OrderBy(x => x).ToList(); 
       stpw.Stop(); 
       sum += stpw.ElapsedTicks; 
      } 
      avgs[i-1] = sum/(double)tests_per_size; 
     } 
     foreach(var t in avgs) 
      Console.WriteLine(t); 
    } 
} 
를 만든 이유 등 this one 그래서 내가 궁금하네요 LINQ의있는 OrderBy 기능의 복잡성에 다른 SO 게시물을 읽었습니다

는 다음과 같은 결과를 얻었습니다.

15076,327 
17261,652 
19528,579 
21993,155 
24674,83 
26927,163 
29332,665 
32018,45 
35143,727 
38955,111 
43188,589 
47605,542 
52243,952 
57166,918 
63454,059 
70261,749 
75997,727 
82249,885 
88953,873 
96958,163 
104520,145 
112432,1 
120746,806 
129694,464 
138588,981 
148007,988 
157616,249 
167493,94 
177748,543 
188904,677 
200761,557 
212235,986 
225877,753 
239173,783 
252288,474 
265901,092 
279629,762 
294529,835 
309429,827 
326944,916 
343254,802 
361306,427 
378797,508 
395831,364 
413546,694 
431166,319 
449165,652 
467562,618 
487180,928 
505969,021 
525013,641 
544555,831 
564859,752 
585357,237 
606849,766 
628464,581 
651009,432 
673865,517 
697340,663 
720709,903 
744837,668 
769024,863 
793921,415 
819441,534 
845185,441 
873421,004 
901587,713 
928140,083 
955403,824 
983023,284 
1011295,028 
1040868,504 
1070366,748 
1100416,455 
1131158,53 
1162260,852 
1193641,253 
1225165,58 
1257410,12 
1289450,658 
1322668,533 
1358718,074 
1400162,62 
1440996,876 
1483102,815 
1531781,127 
1581157,377 
1627831,867 
1673969,553 
1713026,287 
1750012,667 
1787497,946 
1825893,268 
1864184,643 
1902912,621 
1942420,978 
1982395,399 
2023052,109 
2063803,114 
2106027,85 

약 10 개의 숫자가 대략 두 배가됩니다.

+4

스톱워치를 시작한 다음 현재 경과 값을 가져온 다음 다시 사용합니다 스톱워치를 재설정하지 않고? 이렇게하면 경과 값이 더 빨리 누적됩니다. 내부 루프 내부에 스톱워치를 재설정하거나 내부 루프 외부의 최종 경과 값을 읽으십시오. –

답변

1

글쎄, 한가지는 스톱워치를 보내지 않으므로 표시되는 타이밍이 누적되는 것입니다. Start() 전화를 Restart()으로 변경하면 더 안전한 값을 얻을 수 있습니다.

또 다른 중요한 점은 배열의 크기를 최대 100 개까지만 테스트한다는 것입니다. 알고리즘의 점근 적 동작을 명확하게 볼 수는 없습니다.

마지막으로 OrderBy()을 테스트하는 것이 아니라, ToList()도 테스트하는 것입니다. 효과는 크지 않지만 좋은 테스트는 여러분이 정말로 관심이있는 부분을 격리시켜야합니다.