2

我有一个网络抓取工具,用于从 wp7 中的不同来源抓取新闻。我目前这样做的方法是:

  • 从 xml 文件加载报纸信息。
  • 转到指定部分并获取新闻项目的 url。
  • 转到每个网址并获取标题、图片、发布者。
  • 使用 windows phone 的 MVVM 架构显示。

整个事情是异步发生的……这意味着一旦从报纸的某个部分获取了 url,它就会被添加到队列中,第二阶段包括获取标题、图像等开始……并且一旦获取到即使是一篇文章,也会显示出来。稍后随着更多文章被获取,它们被添加到列表中。

出于获取目的,我在 windows phone 上使用了 SmartThreadPool( http://www.codeproject.com/Articles/7933/Smart-Thread-Pool )。

我的问题是……即使从 9 个出版物中获取大约 80 个项目(总共),也需要一分钟多的时间。我怎样才能加快程序?

注意:我有一个两阶段的方法,因为很多时候图片没有标题,只能在文章中找到。

4

2 回答 2

2

发出 80 个 Web 请求并获得 80 个响应需要一分钟多的时间,这并不奇怪。即使在有线连接上,请求和响应之间通常至少需要 500 毫秒。根据服务器和您的连接,请求和响应之间的一整秒延迟并非不合理。这还不包括下载内容所需的时间。

您的 3 Mbps 链路是每秒 3 兆位*,或每秒小于 400 KB,这将与使用同一塔或连接点的其他所有人共享。

我对 SmartThreadPool 不熟悉,也不知道你是如何使用它的。但是,它可能会限制并发线程的数量,并且您每个请求使用一个线程。因此,如果它将您限制为 4 个并发线程,那么您可以做的最好的事情可能是每秒 4 次下载。

相反,如果您使用单个线程发出多个异步 Web 请求,则可以有 15 个(可能更多)并发请求。由于发出 Web 请求所花费的大部分时间都花在等待服务器的响应上,因此与其他方法相比,这将大大提高性能。假设您正在下载的新闻文章不是那么大,以至于您的限制因素是带宽。

根据您的描述,我想说您不需要做任何显式的多线程。只需使用异步 Web 请求。

当然,所有这些都是猜测,因为您没有显示任何代码或提供太多详细描述。但如果我要像你描述的那样写一个新闻抓取工具,这就是我会采取的方法。

于 2013-10-28T19:21:16.947 回答
0

(对于这样的问题, https://softwareengineering.stackexchange.com/不是更好的家吗?)

要考虑的事情:

图片需要时间来加载,即使是在 3G 或 4G 手机上,跳过或推迟加载!

看看NextGen 阅读器在 WP8 上是如何做到的(也适用于 Win8):

  • 它提取文章的摘录并几乎立即显示它们
  • 当您点击一篇文章时,它会完整加载它(带图片)
  • 如果图片加载时间过长,则不会显示,请注意,某些网站需要特定的推荐人,无论是出于安全原因还是仅通过其网站访问其链接
  • 即:图片无法加载的原因有很多,除了它的大小/您的连接速度
  • 仍然在读者身上,当您点击文章标题时,它会在 IE 中打开链接,我的意思是这样做不再是您的问题了,因为人们正在上网而不是使用您的应用程序

在我看来,你应该让你的应用程序运行得足够快,但它不一定是完美的(尤其是图像部分),随着时间的推移,人们会很快明白,如果图像丢失不是你的应用程序的错,而是那些网站(这是顺便说一句,这是真的)。

你可以看看桌面应用程序。用Fiddly看看它到底做了什么。

几个月来我每天都在我的 WP8 上使用这个阅读器,我对这种行为很满意,我知道对于丢失的图像(更准确地说,在某些网站上)我要么必须浏览网站本身,要么就忘记它我不怪应用程序。


现在我遇到了类似的问题,问了一个问题,最后我回答了自己:

我需要从许多不同的来源加载许多图像,它必须很快。最阻碍的问题是超时,因为它们等待的时间很长/很烦人。我最终跳过了缓慢图像的加载,尽管其中一些不可见,但我对此感到非常高兴:

在此处输入图像描述

还有一些图片不可用,但从感觉上看,它并不像这里的内容那么重要:文本和指向原始网站的链接。您可以随时尝试在后台再次加载。

我发布的代码足以满足我的需求,如果一张图片超过 3 秒,我就跳过它。我可以稍后再尝试加载它,但我的应用程序最重要的部分在这里:响应性。除此之外,我同时下载了一些东西,我邀请你看看我在下面发布的答案:

异步和并行下载文件

需要考虑的额外事项:缓存图像

于 2013-10-28T20:30:03.713 回答