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%的速度运行),但队列中的等待时间将更短。有多少任务?