【发布时间】:2017-05-08 21:44:39
【问题描述】:
很多人[1][2]说Response.Redirect(url)不好,我们应该使用Response.Redirect(url,false),因为前者会抛出异常并杀死线程,因此存在可伸缩性问题。
所以我想知道这两种方式在数值上的性能差异。
我创建了一个asp.net网页,其唯一代码是Response.Redirect。
然后我编写了这个控制台应用程序来向页面发出请求。
private const int concurrentRequests = 800;
static void Main(string[] args)
{
Console.WriteLine("Type in the URL:");
var url = Console.ReadLine();
Console.WriteLine($"concurrentRequests={concurrentRequests}");
ServicePointManager.DefaultConnectionLimit = concurrentRequests;
List<Task> tasks = new List<Task>(concurrentRequests);
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < concurrentRequests; i++)
{
Task t = new Task(o => GetResponse((string)o), url);
tasks.Add(t);
t.Start();
}
Task.WaitAll(tasks.ToArray());
watch.Stop();
Console.WriteLine($"Execution time: {watch.ElapsedMilliseconds}");
Console.ReadKey();
}
static void GetResponse(string url)
{
var request =(HttpWebRequest) WebRequest.Create(url);
request.AllowAutoRedirect = false;
var response = request.GetResponse();
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
var content = sr.ReadToEnd();
}
}
我还在 machine.config 中将 asp.net 线程减少到 4 个。
但是,结果 Response.Redirect(url) 需要 350 毫秒才能执行,而 Response.Redirect(url,false) 需要 415 毫秒。
为什么结果不符合文章中的理论?
【问题讨论】:
-
总之你应该强调时间。我的意思是每秒检查请求数。