2011-01-31 56 views
3

我一直在C++程序中使用某些庫來連接和獲取不同的網站。主要是我用Chillkat和Curl。但是,最近我開始使用MSDN和Winsocket2庫的幫助編寫我自己的HTTP fetcher。C++中HTTP GET方法的速度

我編寫了我的軟件,打開一個SOCKET_STREAM類型的套接字和Ipv4, ,然後我建立與所需網站的連接,併發送帶有「Host:」和「Connection:close」頭的GET請求到服務器。 似乎一切正常,但是,性能不如我預期。捆綁的Chillkat庫仍然會比我的更好。儘管我儘可能地優化了我的內容。

我注意到,當我發送請求時,一些服務器需要更長的時間來響應。一旦他們做到了,他們立即發送所有的東西。那麼我怎樣才能做出一個頭部請求來啓動一個快速響應呢?速度對我的程序很重要。

+0

我懷疑有一個標題請求速度碰撞,雖然你可以檢查Chillkat發送的頭文件以確保你沒有丟失任何東西。至於分塊,這是正常的;很多網站都這樣做,所以你必須在自己的圖書館處理。 – chrisaycock 2011-01-31 22:20:37

+0

檢查改變套接字緩衝區是否會給你一個提升,也許你會浪費你的時間去閱讀往往很小的數據塊。有時最好等待更大的塊並立即傳遞,而不是閱讀很多次的小塊 – 2011-01-31 22:24:52

+1

單個人編寫優化函數的機會大大超過了由數千名合併開發人員執行的優化,所有代碼審查和批評每個其他優化小到幾乎爲零。如果速度問題需要使用一個普遍使用並且知道速度的良好圖書館。 – 2011-01-31 22:30:57

回答

1

如果您看到低容量現代機器上的性能差異,最可能的問題是您忘記關閉Nagle算法。使用setsockopt()將TCP_NODELAY設置爲1. HTTP不是Telnet。

我不擔心顯式刷新或緩衝區管理或類似的東西,直到你看到一個性能問題,你有足夠的容量來注意。除了在一次寫入呼叫中寫入您的請求。

對於下載速度,窗口大小有所不同。您可以調整SO_SNDBUF和SO_RCVBUF。請記住,使您的基準測試速度變快的值可能會使您的實際性能變慢。

0

老實說,HTTP是一個複雜的標準,有很多方法可以優化實現。然而,你有足夠的時間來優化它的可能性比一個已經打包好的庫如Chillkat或Curl更不可能。如果您確實想要了解它,我會建議減少您發送的頭數,並在將狀態行寫入套接字後清空套接字緩衝區(繞過Nagle的算法)。這將使適當編碼的服務器稍長(幾毫秒上限)以響應您的請求。但即便如此,如果您的網絡配置不是「理想」的話,即使這樣也會炸燬你的臉。

最後,請記住,當涉及到網絡時,存在非常大的誤差範圍,並且使用不同的服務器,網絡甚至操作系統的不同策略可能會得到不同的結果。