控制台应用程序比asp.net应用程序慢

时间:2013-03-17 09:15:21

标签: c# asp.net performance task-parallel-library parallel.foreach

我有一个crawlerbot,它使用parallel.for和parallel.foreach并行下载各种页面。 MaxDegreeOfParallelism设置为大约20,因为增加它似乎不会进一步提高性能,我不想重载任何Web服务器。

当我从一个ASP.NET网站(所有地方)开始抓取时,它的运行时性能可以接受,而这一切都需要几个小时。由于此设置存在设计问题,我正在更改此设置,以便我可以从控制台启动它。

我需要的所有代码都在一个dll中,网站和控制台应用都可以访问。

除启动消息外,控制台没有输出。

问题在于,当我从控制台(或从调试器)运行它时,它比从ASP.NET网站运行它需要大约10倍(!)。如果ASP.NET版本比控制台慢,我会发现它更容易理解。

为什么会如此,或者我如何调试或找出原因或解决问题?

编辑: 当通过visual studio调试器尝试这两种变体时也会发生这种情况。 从'Debug'到'Output'窗口的输出类似于:

线程''(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来压缩它。

1 个答案:

答案 0 :(得分:2)

如果您从同一台服务器下载大量页面,则会遇到ServicePointManager.DefaultConnectionLimit设置的限制。默认值通常为2(as suggested by the HTTP 1.1 RFC),但对于ASP.NET应用程序来说似乎是10。如果您看到不同的数字,则可能会更改默认值。

当你达到这个限制时,框架将不再与该特定服务器(或“端点”)建立连接,因此大多数线程将阻止什么都不做。

您可以通过更改DefaultConnectionLimit的值来解决此问题,但更好的解决方案可能是更改请求的顺序,以便您不会同时向同一服务器执行多次请求。