2012-05-21 46 views
0

我有一个程序,我试图尽可能快地工作。这个程序加载了许多不同的网站,并对它们进行了一些修改。HtmlAgility Pack Parallelisation VS Winforms HtmlDocument速度

我曾经通过使用Forms.HtmlDocument(我基本下载它通过使用WebRequests,然后使用WebBrowser控件将它推入文档)执行刮取 - 但是,这是不可能的,因为无法强制WebBrowser在其不是主线程时更新。

所以我决定尝试一下HtmlAgilityPack,认为或许我可以平行一点。但是后来我看了下面的帖子:

How to get max performance using Parallel.For/ForEach? (performance timings included)

这表明它并没有真正paralelise很好。

转换所有的代码需要一些时间(由于它的怪癖和复杂性) - 但是我想知道它是否值得。如果我避免使用WebGet(而是使用WebRequest获取流并将其推入到AgilityPack中) - 是否会提高性能?目前,每次迭代大约需要19秒,大部分时间都花在等待页面下载上。

任何其他的想法将被考虑。谢谢。

编辑:虽然我们在这里,有没有使用任何一种方法的任何速度增加

回答

1

我的情况htmlagilitypack是工作得很好(甚至在单线程环境?)。一个很大的问题是,当您创建尽可能快速运行的分段应用程序时,RFC合规应该被忽略。

1)在你的主要方法

System.Net.ServicePointManager.DefaultConnectionLimit = 100; 

2)与正常的多线程库和并行化TPL没有的beggining添加此。

+0

“正常的多线程库”我假设你的意思是开始线程而不是System.Parallel? – Aabela

+0

Yeap开始的线程给你更多的控制。虽然我没有深入细节,但TPL针对创建尽可能多的线程进行了优化,因为您的处理器可以支持这些线程。相反,在这种情况下并行化应用程序的原因不是为了使处理器饱和,而是为了并行创建多个http连接。 – Lakis