ToList吃大量的CPU时间

时间:2017-03-13 19:29:39

标签: c# linq list .net-core

编辑:我追查了原因。后来在代码中我犯了一个错误,导致非碰撞记录被合并到主数据存储中(在下面的代码中为t),对于它没有碰撞的每个记录,基本上每个记录除了一个它确实发生了碰撞,因此经过几千次比较后,主列表将呈指数级增长,而且会有几万亿条记录,而不是几百条记录。

我正在尝试排序,搜索和合并300-400套的大量3d数据点。我遇到了单个linq线的问题,这似乎占据了我处理时间的90-95%。大约3000套,处理时间几乎不存在,但是当我达到3000时,整个过程几乎停止了。

dottrace告诉我,我所有的处理时间都是专门的调用和等待.tolist(),但是我找不到更高效的linq替代方案。 (我总是可以回到我对这个问题的c ++实现,但我希望linq可能有一个比我能合理提出的更有效的解决方案。)

有问题的linq是

List<Point> collisions = t.Points.Intersect(streamline.Points, new PointsComparer()).ToList();

此查询的目的是获取t中的所有点和流线中的所有点,比较它们,并生成所有重复点的列表。

值得注意的是,t.Points和streamline.Points已经预先排序,所以我可以对它们进行二进制搜索,但我不确定如何用linq做这个。

如果有人能够解释我在这里失踪的原因导致它试图生成这么多列表,那么

会非常感激。

为了更好的衡量,这里是point和PointsComparer类。 (t.points和streamline.Points是列表)

public class PointsComparer : IEqualityComparer<Point> {
    public bool Equals(Point x, Point y) {
        if (object.ReferenceEquals(x,y)) return true;
        return x.X.Equals(y.X) && Equals(x.Y, y.Y) && Equals(x.Z, y.Z);
    }

    public int GetHashCode(Point obj) {
        int xhash = obj.X.GetHashCode();
        int yhash = obj.Y.GetHashCode();
        int zhash = obj.Z.GetHashCode();

        return xhash ^ yhash ^ zhash;

    }
}
public class Point {
    public float X;
    public float Y;
    public float Z;
    public float[] Scalars = {};
    public int OriginalIndex;
}

0 个答案:

没有答案