2010-04-26 6 views
4

나는 List.Count에서 시작하여 배열의 끝에서 시작하여 역순으로 작업하는 5 개의 항목을 복사하여 배열로 역순으로 복사 할 수있게하려는 List<T>을 가지고 있습니다. 나는 간단한 역순으로이 작업을 수행 할 수있다. for loop; 그러나 아마도 이것을 수행하는 더 빠르고 효율적인 방법이 있습니다. 그래서 물어야한다고 생각했습니다. 어떻게 든 Array.Copy을 사용할 수 있습니까?배열을 거꾸로 복사 하시겠습니까? Array.Copy?

원래 올바른 번호순으로 꺼내기 때문에 원래는 Queue을 사용하고 있었지만 지금은 배열에 여러 항목을 한꺼번에 표시해야하고 목록이 더 빠를 것이라고 생각했습니다.

+1

"목록이 더 빨라질 것이라고 생각했습니다." - 성능 문제를 측정 했습니까? 그렇지 않다면, 당신은 조기에 마이크로 최적화 중입니다 ... –

+0

과 조숙 한 최적화는 모든 악의 뿌리입니다 (크 누스) – mmr

+0

하지만 큐를 사용하면 한 번에 하나씩 꺼내 올 수 있지만 목록으로는 범위를 수행 할 수 있습니다 이것은 대부분의 경우 더 빠릅니다. – daniel

답변

3

Array.Reverse에는 적용 할 수없는 배열을 되돌리기위한 기본 코드가 있으며 간단한 for 루프를 사용하는 것으로 되돌아갑니다. 내 테스트에서 Array.Reverse은 매우 간단한 루프보다 빠릅니다. 1,000,000 요소 배열을 1,000 번 역전시키는이 테스트에서 Array.Reverse은 약 600ms이고 for 루프는 약 800ms입니다.

비록 성능이 Array.Reverse을 사용하는 이유로 권장하지 않습니다. 배열을 다시 반복하는 List에로드하는 순간 분명한 차이가 있습니다. 어쨌든 앱을 프로파일 링하고 성능 병목 현상을 확인할 때까지는 성능에 대해 걱정할 필요가 없습니다. 귀하의 의견 중 하나에서

public static void Test() 
    { 
     var a = Enumerable.Range(0, 1000000).ToArray(); 

     var stopwatch = Stopwatch.StartNew(); 

     for(int i=0; i<1000; i++) 
     { 
      Array.Reverse(a); 
     } 

     stopwatch.Stop(); 

     Console.WriteLine("Elapsed Array.Reverse: " + stopwatch.ElapsedMilliseconds); 

     stopwatch = Stopwatch.StartNew(); 

     for (int i = 0; i < 1000; i++) 
     { 
      MyReverse(a); 
     } 

     stopwatch.Stop(); 

     Console.WriteLine("Elapsed MyReverse: " + stopwatch.ElapsedMilliseconds); 
    } 

    private static void MyReverse(int[] a) 
    { 
     int j = a.Length - 1; 
     for(int i=0; i<j; i++, j--) 
     { 
      int z = a[i]; 
      a[i] = a[j]; 
      a[j] = z; 
     } 
    } 
+0

나는 성능상의 병목 현상이라고 지적했다.현재 우리는 하나의 결과를 하나씩 꺼내 데이터베이스에 하나씩 커밋하고 있지만 한 번에 하나의 범위를 커밋하도록 하겠지만 순서대로 수행해야합니다. 그래서 나는 그것을하고있다. – daniel

+5

@ 대니얼,하지만 병목 현상은 데이터베이스에 대해 한 번에 하나의 쿼리를 실행하고, 배열을 반대로하지 않는 것으로 가정합니다. –

+0

사실, 똑바로 xD 생각하지 못했습니다. – daniel

1

간단한 for 루프보다 빠르게 수행 할 수 없습니다.

0

여러 가지 방법으로 달성 할 수 있지만 가장 빠른 방법은 요소를 정확하게 얻는 것입니다. Array.Reverse, Array.Copy 등을 사용하거나 LINQ 및 확장 메서드를 사용할 수 있으며 둘 다 유효한 대안이지만 더 빠르지 않아야합니다.

0

는 :

는 현재 우리가 시간

에서 데이터베이스 하나에 하나 개의 결과를 철수하고 커밋하는 것은 큰 차이 사이에있다 for 루프를 사용하여 List<T> 위로 거꾸로 반복하고 한 번에 하나씩 데이터베이스에 레코드를 커밋합니다. 전자는 괜찮습니다. 아무도 후자를지지하지 않습니다.

먼저 배열을 채우기 위해 왜 배열을 모두 채우는 것이 좋을까요?

var myArray = new T[numItemsYouWantToSend]; 

int arrayIndex = 0; 
for (int i = myList.Count - 1; arrayIndex < myArray.Length; --i) { 
    if (i < 0) break; 
    myArray[arrayIndex++] = myList[i]; 
} 

UpdateDatabase(myArray); 
관련 문제