C#多線程發送http請求效率是否比python慢?
按照本人一貫的想法,C#作為編譯語言應該比解釋型語言python運行效率要高。但是當我在寫多線程爬蟲時卻發現python的運行效率更高,於是做了一個測試:
C#:
python:
結果C#的運行結果(運行時間)是15.67s,而python是3.46s,當線程數增大時差距更明顯。
本人新手,求大佬們能告訴我是什麼原因(比如我C#代碼哪裡寫殘了),謝謝!
測試環境:
系統:Windows XP Service Pack3
CPU:AMD Athlon(tm)II X4 620 Processor 2.60Ghz
python:2.7.12
.net:4.0
C#編輯器:Microsoft (R) Visual C# 2010 Compiler version 4.0.30319.1(我用的是.net自帶的csc)
你這個地方慢是因為使用HttpRequest有個限制並發數,ServicePointManger.DefaultConnectionLimit這個值默認2你改大一點比如512應該會快很多
你代碼寫的問題,應該用HttpClient+Dataflow,非同步發送請求,我通常都要限制並發量避免網站被我爬死。
不過,我覺得你的那個結果出現的原因是莫名其妙的Sleep邏輯導致的。
通常來說語言只能決定性能的上限,但是程序員決定了性能的下限。帶網路傳輸的程序,難道瓶頸不是在網路嘛。。網路隨便卡一下就不準了
-------------------分割線------------------
性能這種東西真是不調試就沒有發言權。晚上我敲了個代碼,發現果然C#這樣是非常慢的,10×20個請求居然的確是要15秒左右。從打log結果看,基本斷定是HttpWebRequest沒有多線程起來,基本都是等一個請求執行完才執行下一個造成的。
中間各種猜想實驗略過不表,畢竟不是玩C#的,各種不懂。。
最後是發現,下了斷點一看,基本所有的線程都卡在System.dll!System.Net.LazyAsyncResult.WaitForCompletion這個地方
百度了一下,發現了個文章Timeouts When Making Web Requests in .NET,
裡面寫到:
Each time you create a request, there is a System.Net.ServicePoint assigned to it. ServicePoint then tries to find a connection which will serve a given request. Each write and read operation on a connection is performed by a ConnectStream instance. Connections are pooled and their number is by default limited to two connections per IP address. You may configure the maximum number of connections per IP address or DNS name in the application configuration file (section http://system.netconnectionManagementadd), e.g.:
&
&
&
&http://www.wg.net.pl" maxconnection = "4" /&>
&
&
&
&
原來是這個鍋,默認最多一個地址只能有兩個connection,怪不得如此。。
改成100個,可以到3.x到4秒之間了,這樣看著就比較正常了。。
更新完答案一看已經有匿名大牛給出這個結論了。但樂趣就在於debug的過程,難道不是嗎,哈哈哈
就沒有人吐槽操作系統嗎,Windows XP SP3....我還真沒見過程序員還在用XP的。。
C#是語言,不是CLR,跟性能沒關係。.net framework和.net core有不同的CLR實現,據我所知.net core的http性能很贊。
代碼的問題,不能怪C#,C#也是敢號稱性能第一的,Python性能都是自暴自棄的類型
測試用例寫的不好,偶然性太高。
1你的線程配置問題有回答已經回復了
2.你要是追求極致。。windows下還有c#比不過的?連com組建直接用windows內核發。。試問除了c跟c++哪個高級語言能比?
你用CCL(CLOZURE COMMON LISP)試試,看它們3個哪個快。
我記得.net默認有個代理設置什麼的,不關的話第一次會有延時。
http://m.blog.csdn.net/article/details?id=50328673
「眾所周知,C#作為編譯語言應該比解釋型語言python運行效率要高。」
等下我怎麼不知道,你確定這是對的?#(滑稽)
不懂c#也不懂python,不過你的c#似乎沒開優化啊#(滑稽)推薦閱讀:
※一個爬蟲框架需要具備哪些功能?
※爬蟲數據礦工的命運?
※標準化的互聯網採集工具的前景在哪裡?
※pyspider 和 scrapy 比較起來有什麼優缺點嗎?
※如何對使用了ssl pinning的APP(如知乎)進行抓包?