C# 创建更多httpwebrequests时,已用毫秒数越少

C# 创建更多httpwebrequests时,已用毫秒数越少,c#,multithreading,httpwebrequest,task-parallel-library,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 = Syste

我正在对服务器进行压力测试,因此在工厂内创建了
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);
}
for(int i=0;i
{
System.Diagnostics.Stopwatch=System.Diagnostics.Stopwatch.StartNew();
HttpWebResponse=(HttpWebResponse)request.GetResponse();
看,停;
},i);
}

这种行为的原因很简单:系统中的任务越多,每个任务完成任务的时间就越短。您的计算机在CPU上有一组有限的内核,所以在固定值之后,您将获得更高的响应时间

您真的应该将测量切换到服务器本身,节省请求启动和响应结束时的时间—所有其他时间都与服务器性能无关,而只与基础架构速度有关

另外,我强烈建议您在压力测试中使用class而不是
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);
}
for(int i=0;i
{
System.Diagnostics.Stopwatch=System.Diagnostics.Stopwatch.StartNew();
HttpWebResponse=(HttpWebResponse)request.GetResponse();
看,停;
},localI);
}

原因是响应时间既包括请求在队列中等待处理的时间,也包括处理请求的时间


如果有更多的线程来处理请求,那么处理每个请求的时间将大致相同(直到有那么多线程,CPU以100%的速度运行),但队列中的等待时间将更短。

有多少任务?