【发布时间】:2015-09-19 04:45:13
【问题描述】:
想象一下下面的代码:
var htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.OptionAutoCloseOnEnd = false;
htmlDoc.OptionCheckSyntax = false;
htmlDoc.OptionFixNestedTags = false;
htmlDoc.OptionOutputOptimizeAttributeValues = false;
htmlDoc.LoadHtml(html); /*Where html is a string of 5MB size.*/
/*First approach to select all "anchor" elements*/
HtmlNodeCollection coll = htmlDoc.DocumentNode.SelectNodes("//*/a");
if (coll != null && coll.Count > 0)
ReplaceSourceLinks(coll, "href");
上面的代码应该加载一个约 5MB 的 HTML 字符串,并将 HTML 中的所有 9567 个锚点的 href 替换为适合应用程序的内容。上面的代码执行需要1998ms。
所以我决定用以下代码替换上面显示的最后 3 行,也就是说,我决定使用以下代码,而不是使用 XPATH 来处理这些锚点:
IEnumerable<HtmlNode> coll = htmlDoc.DocumentNode.Descendants("a");
if (coll != null)
ReplaceSourceLinks(coll, "href");
新方法只需 220 毫秒即可执行!比第一种方法快了近 89%。我只想知道这些代码是否相同。它们是否针对同一组锚点? (顺便说一下,第二个也选择了相同的 9567 个元素)。为什么第二种方法的执行速度要快 89%?
谢谢。
【问题讨论】:
-
两次测试之间你清除缓存了吗?
标签: c# performance xpath html-agility-pack