Это действительно хорошее место для использования параллельной библиотеки задач в .NET 4.0.Я завернул ваш код в блок Parallel.For
, который будет выполнять несколько наборов запросов параллельно, сопоставлять общее время в каждой параллельной ветви, а затем вычислять общий результат.
int n = 16;
int reqs = 10;
var totalTimes = new long[n];
Parallel.For(0, n, i =>
{
for (int req = 0; req < reqs; req++)
{
Stopwatch w = new Stopwatch();
try
{
w.Start();
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("http://localhost:42838/Default.aspx");
webRequest.AllowAutoRedirect = false;
HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();
w.Stop();
totalTimes[i] += w.ElapsedMilliseconds;
//Returns "MovedPermanently", not 301 which is what I want.
int i_goodResponse = (int)response.StatusCode;
string s_goodResponse = response.StatusCode.ToString();
Console.WriteLine("Normal Response: " + i_goodResponse + " " + s_goodResponse);
}
catch (WebException we)
{
w.Stop();
totalTimes[i] += w.ElapsedMilliseconds;
int i_badResponse = (int)((HttpWebResponse)we.Response).StatusCode;
string s_badResponse = ((HttpWebResponse)we.Response).StatusCode.ToString();
Console.WriteLine("Error Response: " + i_badResponse + " " + s_badResponse);
}
}
});
var grandTotalTime = totalTimes.Sum();
var reqsPerSec = (double)(n * reqs * 1000) / (double)grandTotalTime;
Console.WriteLine("Requests per second: {0}", reqsPerSec);
TPL очень полезен здесь, поскольку он абстрагирует детали создания нескольких потоков выполнения в вашем процессе и запуска каждой параллельной ветви в этих потоках.
Обратите внимание, что вы все равно должны быть здесь осторожны - мы не можем делить состояние, которое обновляется во время выполнения задач, между потоками, следовательно, массив для totalTimes
, который объединяет итоги для каждой параллельной ветви и суммируется только всамый конец, когда параллельное выполнение завершено.Если мы этого не сделали, мы открыты для возможности состояния гонки - когда два отдельных потока пытаются обновить общее количество одновременно, потенциально искажая результат.
Я надеюсь, что это имеет смысл и полезноДля начала (здесь я вычисляю только запросы в секунду, остальные статистические данные добавить сравнительно легко).Добавьте комментарии, если вам нужны дальнейшие разъяснения.