为什么迭代DOM愚蠢的代码变慢?

时间:2010-11-09 20:44:26

标签: c# optimization html-agility-pack

这嵌套了大约10个函数,所以我只是粘贴相关的位:

这条线真的很慢:

var nodes = Filter_Chunk(Traverse(), chunks.First());

具体来说,Filter_Chunk内的这个块(双关语不是):

private static IEnumerable<HtmlNode> Filter_Chunk(IEnumerable<HtmlNode> nodes, string selectorChunk)
{
    // ...
    string tagName = selectorChunk;
    foreach (var node in nodes)
        if (node.Name == tagName)
            yield return node;

那里没有什么太复杂的......所以我认为它必须是Traverse()中的绝对数量的节点吗?

public IEnumerable<HtmlNode> Traverse()
{
    foreach (var node in _context)
    {
        yield return node;
        foreach (var child in Children().Traverse())
            yield return child;
    }
}

public SharpQuery Children()
{
    return new SharpQuery(_context.SelectMany(n => n.ChildNodes).Where(n => n.NodeType == HtmlNodeType.Element), this);
}

我尝试在stackoverflow.com上找到<h3>个节点。那应该不会超过几千个节点吗?为什么这需要几分钟才能完成?


实际上,这里肯定存在一个错误,导致它返回的节点多于它应该... I forked the question to address the issue

1 个答案:

答案 0 :(得分:2)

public IEnumerable<HtmlNode> Traverse()
{
    foreach (var node in _context)
    {
        yield return node;
        foreach (var child in Children().Traverse())
            yield return child;
    }
}

这段代码对我来说很奇怪。 Children()对于_context是独立的,因此在_context中为每个节点一次运行子项是没有意义的。