2011-09-29 97 views
3

下面的代碼是否有更快的替代方法來將http響應轉換爲字符串?HttpWebRequest/HttpWebResponse的速度

string req = "http://someaddress.com"; 
Stopwatch timer = new Stopwatch(); 
timer.Start(); 
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
{ 
     using (Stream dataStream = response.GetResponseStream()) 
     { 
      StreamReader reader = new StreamReader(dataStream); 
      reader.ReadToEnd(); 
     } 
} 
timer.Stop(); 
Console.WriteLine(timer.Elapsed); 

響應相當大 - 大約2MB,採用XML格式。驗證此代碼完成後,計時器等於約50秒。當我將相同的URL粘貼到瀏覽器窗口時,它需要大約35秒才能顯示xml文檔。

+2

你在測量什麼和如何測量?用'Console.WriteLine()'寫XML需要50秒,還是你用它做了什麼?瀏覽器使用35秒將XML呈現爲純文本還是以任何方式格式化XML?我認爲你正在比較蘋果和橘子。 –

+0

我修改了一下 - 希望現在好一點。 – stiopa

+0

正如Jon Skeet所寫,時間可能會花費在解碼字節到'reader.ReadToEnd()'方法的字符串中。您還沒有提供任何關於您在網絡瀏覽器中測量的信息。 –

回答

3

(你應該有一個using聲明的反應,順便......我與asbjornu的評論表示贊同。你應該有更多的細節更新你的問題。)

你應該使用類似Wireshark看在每種情況下請求和響應的樣子。例如,瀏覽器是否指定它支持壓縮響應,並且WebRequest不是?如果它的速度慢,那很可能是重要的一部分。

另一件要測試的問題是,字符串解碼是否在.NET代碼中佔用大量時間......如果您只是將數據從流中讀取到字節數組中(可能只是在讀取時拋棄它)是那明顯更快?例如:

using (var response = request.GetResponse()) 
{ 
    using (var stream = response.GetResponseStream()) 
    { 
     // Just read the data and throw it away 
     byte[] buffer = new byte[16 * 1024]; 
     int bytesRead; 
     while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      // Ignore the actual data 
     } 
    } 
} 
+0

你的代碼使它快2秒鐘。 – stiopa

+0

瀏覽器請求: GET somerequest HTTP/1.1 Host:somehost User-Agent:Mozilla/5.0(Windows; U; Windows NT 5.1; en-GB; rv:1.9.2.22)Gecko/20110902 Firefox/3.6.22 .NET CLR 3.5.30729) Accept:text/html,application/xhtml + xml,application/xml; q = 0.9,*/*; q = 0.8 Accept-Language:en-gb,en; q = 0.5 Accept-Encoding:gzip,deflate Accept-Charset:ISO-8859-1,utf-8; q = 0.7,*; q = 0.7 Keep-Alive:115 Connection:keep-alive – stiopa

+0

@stiopa:Right:not 'Accept-Encoding:gzip,default'。現在WebRequest做什麼? –