我正在尝试通过构建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属性,这对我们来说至关重要。