Почему этот код для итерации по DOM глупо медленный? - PullRequest
1 голос
/ 09 ноября 2010

Вложено около 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);
}

Я попытался найти <h3> узлов на stackoverflow.com .Там не должно быть более пары тысяч узлов, не так ли?Почему это занимает много минут?


На самом деле, где-то определенно есть ошибка, которая заставляет его возвращать больше узлов, чем следовало бы ... Я ответил на вопрос, к которому нужно обратитьсявыпуск

1 Ответ

2 голосов
/ 10 ноября 2010
public IEnumerable<HtmlNode> Traverse()
{
    foreach (var node in _context)
    {
        yield return node;
        foreach (var child in Children().Traverse())
            yield return child;
    }
}

Этот код выглядит странно для меня. Children() не зависит от _context, поэтому нет смысла запускать дочерние элементы один раз для каждого узла в _context.

...