2009-09-22 110 views
1

我將一個XML字符串發佈到AIX盒子上的一個端口。我有兩種連接到這個盒子的方式(TcpClient & HttpWebRequest)。我有定時器給我一個想法,讓我知道用AIX框處理我的請求和響應需要多長時間。性能比較TcpClient vs HttpWebRequest

看來TcpClient比HttpWebRequest快100毫秒。我懷疑我的計時器位置可能不正確。無論哪種方式,我不認爲計時器的位置會在響應時間上造成如此大的差異。

我的另一個想法是使用語句。也許他們保持連接打開比TcpClient更長。

已知TcpClient方法更快?

// TcpClient 
TcpClient client = new TcpClient(host, port); 
DateTime x = DateTime.Now; 
NetworkStream stream = client.GetStream(); 
NetworkStream stream = client.GetStream(); 
stream.Write(request, 0, request.Length); 
stream.Flush(); 
while ((count = stream.Read(buffer, 0, buffer.Length)) > 0) 
      response.Append(encoder.GetString(buffer, 0, count)); 
DateTime y = DateTime.Now; 
totalMS = y.Subtract(x).TotalMilliseconds; 


// HttpWebRequest 
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(URI); 
using (Stream webStream = webRequest.GetRequestStream()) 
{ 
    webStream.Write(postdata, 0, postdata.Length); 
    webStream.Close(); 
    DateTime x = DateTime.Now; 
    using (WebResponse webresponse = webRequest.GetResponse()) 
    { 
     webresponse.Close(); 
     DateTime y = DateTime.Now; 
     using (Stream rs = webresponse.GetResponseStream()) 
     { 
      using (StreamReader sr = new StreamReader(rs, Encoding.Default)) 
      { 
       // Read response to end 
      } 
     } 
    } 
} 
totalMS = y.Subtract(x).TotalMilliseconds; 

回答

5

那麼他們顯然做了不同的事情 - 你沒有發送任何數據的TcpClient,所以另一端必須已經知道該怎麼做。

WebRequest版本中,你甚至發佈了一些數據......你爲什麼不需要在TcpClient版本的數據?

基本上,它看起來像你沒有比較蘋果和蘋果。考慮到你正在向服務器說不同的協議,很可能你的特定服務器直接通過簡化的協議使用TcpClient。這與比較HttpWebRequestTcpClient一般並不相同。你不能真的使得這樣一個普遍的比較,因爲HTTP是在TCP上分層開始的。

+0

我更新了TcpClient示例。我忽略了流寫作。 – 2009-09-22 16:29:45

+1

好的 - 但它仍然不是真的蘋果,因爲你只是寫了一堆數據和閱讀一堆數據。您沒有任何HTTP解析所需的頭文件解析等。現在,如果您需要使用結果數據來做到這一點,那麼您將不得不包含這一點。如果你不是由於協議不要求它,那麼你真的只是表明直接協議是有效的「瘦」,這並不奇怪。 – 2009-09-22 16:54:38

2

只要使用System.Diagnostics.Stopwatch進行時間比較,就會更加準確。

+2

您的TCP客戶端是否也在執行HTTP發佈?如果不是的話,那麼正如Jon所說,你正在比較蘋果和橘子。 即使您正在使用TCP客戶端進行HTTP發佈,HttpWebRequest中始終會存在TcpClient中不會出現的開銷。例如,HttpWebRequest將遵循HTTP協議,並且如果Expect100Continue = true,則在發佈數據之前它將等待高達350ms(或更早,如果服務器發送100繼續響應)。但是,您直接發佈數據。因此,如果服務器在100ms後以「Http/1.1 100 continue」響應,則說明延遲。 – feroze 2009-09-22 17:25:09

+1

最好的方法是使用Wireshark比較兩者之間的網絡嗅探,並查看差異的原因。 – feroze 2009-09-22 17:25:48

3

TcpClient在大多數情況下會更快,因爲HttpWebRequest必須做很多其他事情......比如爲HTTP請求構造頭文件並通過分塊請求等方式管理流連接。 TcpClient只是內置所有HTTP標準的原始連接。