2016-06-21 5 views
2

내가 실제로 게시하는 유일한 이유는 내 코드 성능이이 코드 블록의 영향을 받고 있기 때문에 다른 곳에서 foreach 루프를 사용하기 때문입니다.루프 성능 내 루프

다른 사람이 성능에 도움이 될 수있는 다른 제안이나 코드의 다른 결함을 지적했는지 궁금합니다. 당신은 그냥 내림차순 사전에서 (다른 위치에) 상위 5 개 점수를 표시하고 다른 사전에서 플레이어의 목록에 보내는 것보다시피

public override void DisplayScore() 
    { 
     byte MessageLocation = 0; 
     foreach (var kvp in PlayerScores.OrderByDescending((s => s.Value))) 
     { 
      if (MessageLocation == 5) 
       break; 

      if (MessageLocation == PlayerScores.Count) 
       break; 

      foreach (var player in PlayerList.Values) 
      { 
       SendMessage(MessageLocation, "My text"); 
      } 
      Score++; 
     } 
    } 

.

+0

전송 메시지의 내용은 무엇인가? 이게 이메일인가요? – Sherlock

+2

'MessageLocation'은 무엇이고 그 값을 어디에서 갱신하고 있습니까? –

+3

코드가 좋지는 않지만 성능 문제는 발생하지 않습니다. 'foreach','break' 같은 간단한 구조는 수백만 개의 레코드가있을 때까지 성능 문제를 일으키지 않습니다. 프로파일 링을 시도하거나 적어도 디버깅을 시도하십시오. 대부분의 경우, 문제는'SendMessage'의 어딘가에 있습니다. –

답변

0

대신 당신이 선수로 전송 다음 목록에 점수를 추가하고하여 일부 성능을 얻을 수있다 루프 중첩는 예 :

//List containing player and score 

foreach (var kvp in PlayerScores.OrderByDescending((s => s.Value))) 
{ 
     //Add scores to list  
} 

foreach (var player in PlayerList.Values) 
{ 
     //Send scores to players 
} 
1

내가 이중 루프가 문제라고 생각하지 않습니다. LINQ 쿼리 PlayerScores.OrderByDescending((s => s.Value))을 확인하는 것이 좋습니다. 점수의 수에 따라 순서에 시간이 걸릴 수 있으며 특히 값이 사전에서 오는 경우 시간이 걸릴 수 있습니다. 독해의 내부 구조는 키와 값을 통해 열거하는 데 비용이 많이 듭니다.

당신은 그것을 볼 수있는 다음 코드 (약간 개선) 및 Visual Studio 2015, 그것을 테스트 할 수 있습니다, 얼마나 오랫동안 단일 실행 단계를 수행하십시오

public override void DisplayScore() 
{ 

    var scores = PlayerScores.OrderByDescending(s => s.Value).Take(5).ToArray(); 

    foreach (var kvp in scores) 
    { 
     foreach (var player in PlayerList.Values) 
     { 
      SendMessage(MessageLocation, "My text"); 
     } 
    } 
} 
+1

사전에있는 모든 항목을 반복하는 것이 실제로 비용이 많이 드는 것은 아닙니다. 단지 빠른 것만은 아닙니다. 키를 찾고. 또한 코드에서 '점수'에 대한 할당은 LINQ 쿼리의 게으른 특성으로 인해 매우 빠르다는 점에 유의하십시오. 실제로 그 시점에서 정렬을 수행하지는 않습니다. 실제로 LINQ 부분을 나머지 부분에서 분할하려면 * 질의를 구체화해야합니다. –

+0

예, LINQ의 게으름에 대한 권리. 나는 내 대답을 편집했다. – scher