2009-09-22 136 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标准的原始连接。