神秘的50-100毫秒延迟每个请求到同一个HTTP端点

时间:2014-05-13 22:36:05

标签: http .net-4.5 webclient dotnet-httpclient

我正在尝试提高桌面应用程序的性能,该应用程序向REST服务发出1000个HTTP POST请求。根据Fiddler的说法,服务器会在40-50毫秒内始终响应每个请求。但是,无论我使用WebClient还是HttpClient来发出请求,以及我是否使用同步或异步方法来执行此操作,每隔3或4次调用神秘地需要额外50-100 ms返回。剩下的方法调用相对于网络时序只需要额外1-2毫秒。

10个连续请求的典型时间(以毫秒为单位)如下所示:

Network    Method call    Difference
========   ============   ===========
54         167            113 - ??
43         141            97 - ??
42         43             1
42         43             1
40         106            62 - ??
44         44             0
41         41             0
44         115            71 - ??
41         41             0
38         39             1

您可以在此Fiddler时间轴中看到延迟差距:

Fiddler timeline with gaps

这是同步WebClient版本:

var wc = new WebClient();
wc.BaseAddress = m_endpoint.AbsoluteUri;

// ...add authentication and content headers...

var sw = Stopwatch.StartNew();
var responseStr = wc.UploadString(pathAndQuery, "POST", bodyStr);
sw.Stop();

Debug.Print("HTTP request: {0} ms", sw.ElapsedMilliseconds);

这是异步WebClient版本:

var sw = Stopwatch.StartNew();
var responseStr = await wc.UploadStringTaskAsync(pathAndQuery, "POST", bodyStr);
sw.Stop();

HttpClient版本几乎相同:

m_client = new HttpClient();
m_client.BaseAddress = m_endpoint;

// ...add authentication and content headers...

var content = new StringContent(bodyStr, Encoding.UTF8, "application/json");

var sw = Stopwatch.StartNew();
var response = await m_client.PostAsync(pathAndQuery, content, cancelToken)
    .ConfigureAwait(false);
var responseStr = await response.Content.ReadAsStringAsync();
sw.Stop();

Debug.Print("HTTP request: {0} ms", sw.ElapsedMilliseconds);

所有这些实现都会出现此问题。我的本地计算机空闲,并且一次发送一个请求(不是并发)。

有人能指出可能导致这些神秘延迟的原因吗?

提前致谢!

0 个答案:

没有答案