当创建更多数量的 httpwebrequests 时,经过的毫秒数会减少

Getting lower number for elapsed milliseconds when more number of httpwebrequests are created

我正在对服务器进行压力测试,因此在工厂内部创建了 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);
}

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

你真的应该将你的测量切换到服务器本身,节省请求开始和响应结束的时间——所有其他时间与你的服务器性能无关,而只与基础设施速度有关。

此外,我强烈建议您使用 Parallel 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);
}

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

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