2016-06-21 33 views
2

我發佈這個唯一的原因是因爲我實際上相信我的代碼性能正在受此代碼塊的影響,我在其他內部使用foreach循環。循環內循環性能

我想知道是否有人會建議任何不同的,可以幫助表現或可能指出代碼中的其他缺陷。

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++; 
     } 
    } 

正如你所看到的,它只是從由上至下的字典顯示前5分(在不同的位置),並將它們發送給從另一個字典球員名單。

+0

什麼是發送郵件的內容?這是一封電子郵件嗎? – Sherlock

+2

什麼是'MessageLocation',你在哪裏更新它的值? –

+3

你的代碼看起來很糟糕,但它絕對不會產生任何性能問題。像「foreach」,「break」等簡單結構不會導致性能問題,除非您擁有數百萬條記錄。嘗試分析它,或者至少嘗試調試它。很可能,這個問題在'SendMessage'的某個地方。 –

回答

0

代替嵌套的for循環,可以通過添加的得分列表,然後將它們發送到玩家獲得一些性能,例如:

//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查詢的惰性,在你的代碼中賦值給'scores'會非常快 - 它實際上並沒有在那個時候進行任何排序。如果你想*實際上*將LINQ部分與其他部分分開,你需要實現查詢。 –

+0

是的,您的權利與LINQ的慵懶。我編輯了我的答案。 – scher