Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 循环内循环性能_C#_C# 4.0 - Fatal编程技术网

C# 循环内循环性能

C# 循环内循环性能,c#,c#-4.0,C#,C# 4.0,我发布这篇文章的唯一原因是因为我相信我的代码性能会受到这个代码块的影响,我在另一个代码块中使用了foreach循环 我想知道是否有人会提出一些不同的建议来提高性能,或者指出代码中的一些其他缺陷 public override void DisplayScore() { byte MessageLocation = 0; foreach (var kvp in PlayerScores.OrderByDescending((s => s.Val

我发布这篇文章的唯一原因是因为我相信我的代码性能会受到这个代码块的影响,我在另一个代码块中使用了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位的分数(在不同的位置),然后将其发送到另一个字典中的玩家列表。

您可以通过将分数添加到列表中,然后将其发送给玩家,而不是嵌套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
}

我认为双回路不是问题所在。我建议检查LINQ查询
PlayerScores.OrderByDescending((s=>s.Value))
。根据分数的数量,这可能需要时间来排序,尤其是如果值来自字典。字典的内部结构使得通过键和值进行枚举非常昂贵

您可以使用以下代码(稍加改进)对其进行测试,并且可以看到单个执行步骤需要多长时间:

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");
        }
    }
}

发送消息的内容是什么?这是一封电子邮件吗?什么是
MessageLocation
以及您在哪里更新它的值?您的代码看起来很糟糕,但它肯定不会产生任何性能问题。像
foreach
break
等这样的简单构造在拥有数百万条记录之前不会导致性能问题。尝试分析它,或者至少尝试调试它。问题很可能出在
SendMessage
中的某个地方。请使用parallel.ForEach(最简单的方法)并行处理它。我想,这样做的速度将与您在两个简单循环中得到的速度一样快。如果不知道要花多长时间、集合有多大或SendMessage有什么功能,我们就无法真正判断出问题所在。请发表一篇文章来说明这个问题。我不认为迭代字典中的所有条目实际上是昂贵的,只是它没有按键查找那么快。还要注意的是,由于LINQ查询的惰性,代码中对
分数的赋值将非常快,实际上在这一点上它并没有进行任何排序。如果你真的想把LINQ部分从其余部分中分离出来,你需要具体化这个查询。我编辑了我的答案。