可以做些什么来提高IHTMLDOMAttribute的演员表现?

时间:2015-02-27 15:55:57

标签: c# .net performance com-interop mshtml

我正在尝试通过构建mshtml DOM然后遍历它来清理/修改html树。 问题是,这需要很长时间才能完成,最终需要3-4秒才能获得标准的Twitter时事通讯或与之相提并论的内容。

在分析会话之后,我能够查明热点:

private void AddAttributes(IHTMLDOMNode node)
{
        string nodeName = node.nodeName;
        var attributes = (IHTMLAttributeCollection) node.attributes;
        int length = attributes.length;
        for (int i = 0; i < length; i++)
        {
            //problem line
            IHTMLDOMAttribute attribute = attributes.item(i) as IHTMLDOMAttribute;

            string attributeName = attribute.nodeName;

            //do some work
            ...
        }
}

转换为IHTMLDOMAttribute占用了75%的时间(相比之下,整个DOM创建仅占约3%)

Profiler的AddAttributes输出: 功能体:0.3% 被叫功能:    DoCLRToCOMCall:41.5%    JITutil_ChkCastAny:27.2%    ?InterfaceMarshaler_ConvertToManaged ...:10%

在这种情况下,我该如何改善表现?

我一直在这里:HTML Traversal is very slow,它看起来很相似,但我们仍然坚持使用.NET 3.5,所以动力学是不可能的。关于internet的类似问题还有其他一些报道,但没有明确的答案,只有关于编组问题的提示。

HTML Agility Pack虽然速度更快,却无法解析CSS属性,这对我们来说至关重要。

0 个答案:

没有答案