当创建更多数量的httpwebrequests时,获取经过的毫秒数

时间:2015-05-29 07:48:24

标签: c# multithreading httpwebrequest task-parallel-library

我正在对服务器进行压力测试,从而在工厂内创建HttpWebRequest,但是当检查了不同数量的线程的响应时间时,对于1个线程,响应时间很长,当线程数增加时,响应时间减少了。可能是什么原因?

代码如下:

for (int i = 0; i < tsk.Length; i++)
{
    tsk[i] = Task.Factory.StartNew((object obj) =>
    {
         System.Diagnostics.Stopwatch watch = System.Diagnostics.Stopwatch.StartNew();
         HttpWebResponse response = (HttpWebResponse)request.GetResponse();
         watch.Stop();
    }, i);
}

2 个答案:

答案 0 :(得分:0)

这种行为的原因很简单:系统中的任务越多,每个人完成工作的时间就越短。您的计算机在CPU上具有一组有限的核心,因此在固定值之后,您将获得thread starvation problem,这会导致更长的响应时间。

您真的应该将测量切换到服务器本身,节省请求开始和响应结束的时间 - 所有其他时间不是关于服务器性能,而是关于基础架构速度。

另外,我强烈建议您使用Parallel类而不是TPL进行压力测试,因为它更适合同时操作。

代码中的另一个问题是你在闭包中使用了计数器变量i,所以你应该复制它:

for (int i = 0; i < tsk.Length; i++)
{
    int localI = i;
    tsk[localI] = Task.Factory.StartNew((object obj) =>
    {
         System.Diagnostics.Stopwatch watch = System.Diagnostics.Stopwatch.StartNew();
         HttpWebResponse response = (HttpWebResponse)request.GetResponse();
         watch.Stop();
    }, localI);
}

答案 1 :(得分:0)

原因是响应时间包括请求在队列中等待处理的时间以及处理它的时间。

有更多的线程来处理请求,处理每个请求的时间大致相同(直到你有这么多线程,CPU运行100%),但队列中的等待时间会更短。