【发布时间】:2013-03-17 09:15:20
【问题描述】:
我有一个爬虫机器人,它使用 parallel.for 和 parallel.foreach 并行下载各种页面。 MaxDegreeOfParallelism 设置为 20 左右,因为增加它似乎不会进一步提高性能,而且我不想让任何 Web 服务器过载。
当我从 ASP.NET 网站(所有地方)开始爬网时,它以可接受的性能运行,这一切都需要几个小时。由于此设置的设计问题,我正在更改此设置,以便可以从控制台启动它。
我需要的所有代码都在一个 dll 中,网站和控制台应用程序都可以访问它。
除了启动消息外,控制台没有输出。
问题是当我从控制台(或从调试器)运行它时,它比从 ASP.NET 网站运行它花费的时间大约长 10 倍(!)。如果 ASP.NET 版本比控制台慢,我会更容易理解。
为什么会这样,或者我该如何调试或找出原因或解决问题?
编辑: 通过 Visual Studio 调试器尝试两种变体时也会发生这种情况。 从“调试”到“输出”窗口的输出类似于:
线程 '' (0x1d34) 以代码 0 (0x0) 退出。 线程 '' (0xf20) 以代码 0 (0x0) 退出。 线程 '' (0x3414) 以代码 0 (0x0) 退出。 线程 '' (0x35c8) 以代码 0 (0x0) 退出。 线程 '' (0xdc) 以代码 0 (0x0) 退出。 线程 '' (0x1c98) 以代码 0 (0x0) 退出。 线程 '' (0x3308) 以代码 0 (0x0) 退出。 线程 '' (0x2b00) 以代码 0 (0x0) 退出。 线程 '' (0x2f7c) 以代码 0 (0x0) 退出。 线程 '' (0x345c) 以代码 0 (0x0) 退出。 线程 '' (0x2a18) 以代码 0 (0x0) 退出。 线程 '' (0x138) 以代码 0 (0x0) 退出。 线程 '' (0x3650) 以代码 0 (0x0) 退出。 线程 '' (0x376c) 已退出,代码为 0 (0x0)。
除了在 ASP.NET 情况下,此文本的编写速度快了大约 10 倍。
也许还值得一提的是,该 dll 通过 COM 为每个下载的页面调用 7zip 来压缩它。
【问题讨论】:
-
您是否在两种情况下都在同一硬件上运行代码?
-
是的,所有这些都在我的开发机器上运行。
-
它会从同一个服务器下载大量页面吗?
ServicePointManager.DefaultConnectionLimit和ServicePointManager.MaxServicePoints在这两种环境中的值是多少?您是否试图找出减速的确切位置? -
这里的信息太少,只能猜测原因。 @svick 的建议很好。您需要进行一些分析以确定减速的位置。
-
@svick 它试图同时从同一个主机名下载很多页面,是的。 DefaultConnectionLimit=2 用于控制台应用程序,DefaultConnectionLimit=2147483647 用于 ASP.NET 应用程序。 (ASP.NET 和控制台应用程序的设置之间是否存在其他主要差异?)在控制台应用程序启动时将 DefaultConnectionLimit 更改为 80 使控制台应用程序几乎与 ASP.NET 应用程序一样快。如果你写你的评论作为答案,我会接受。
标签: c# asp.net performance task-parallel-library parallel.foreach