2016-06-21 196 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