为什么Ordered集合枚举较慢以及如何处理它?

问题描述 投票:0回答:1

为什么这段代码:

class Cord  : IComparable<Cord>
{
    public int X { get; set; }
    public int Y { get; set; }

    public int CompareTo(Cordother)
    {
            return this.X.CompareTo(other.X);
    }
}


List<Cord> Cords = LoadCords();
stopwatch.Start();

foreach(var cord in Cords)
{
          // do something
}
stopwatch.Stop();

比这段代码快几倍:

List<Cord> Cords = LoadCords().OrderBy(r=> r.x).ToList();
stopwatch.Start();

foreach(var cord in Cords)
{
          // do something
}

stopwatch.Stop();

为了提高我的应用程序(处理数百万条记录)的性能,我需要一个有序的集合。我还尝试在List项目上使用SortSet和Sort方法来实现IComparable。无论哪种方式,有序列表上的相同迭代比未触及的列表需要更多的时间。为什么这样,我怎样才能使我的排序集合像基本集合一样有效地迭代?

编辑:我只测量迭代的时间。我知道排序需要时间。循环内发生的操作无关紧要。

它实际上就是我用排序注释掉线,迭代时间变得更小。它不应该在其他基准测试中没有,但在我目前的应用程序中,这种情况发生了,我想知道是否有人可以就此主题为我提供一些建议。

c# .net performance linq
1个回答
0
投票

尝试使用linq查询首先过滤结果,而不是在循环中执行条件。

var cords = LoadCords().Where(cord => cord.x >2);
// Now iterate via linq .ForEach/.Select to do something without if condition.

而且正如其他建议使用DataTime.Now不会给出准确的结果。使用秒表。

© www.soinside.com 2019 - 2024. All rights reserved.