C # .NET 2.0, если это применимо.
Я собираюсь начать, чтобы понять, почему наш веб-сервис работает медленно - этот веб-сервис перепрыгивает через прокси-сервер в другой домен, запрашивает хранимую процедуру для некоторых данных, а затем возвращает int / строка / набор данных, в зависимости от того, что я просил. Я только что написал консольное приложение, которое неоднократно запрашивает его таким же образом, чтобы я мог собрать некоторую статистику для начала.
Keep-alive выключен выключен для каждого запроса, по какой-то устаревшей причине никто не задокументировал, так что тут сразу пахнет.
При повторении одного и того же запроса несколько раз я заметил странное поведение. Вот мой вывод, который показывает, сколько времени потребовалось для каждой итерации, чтобы выполнить запрос и вернуть данные.
Beginning run #1...completed in 4859.3128 ms
Beginning run #2...completed in 3812.4512 ms
Beginning run #3...completed in 3828.076 ms
Beginning run #4...completed in 3828.076 ms
Beginning run #5...completed in 546.868 ms
Beginning run #6...completed in 3828.076 ms
Beginning run #7...completed in 546.868 ms
Beginning run #8...completed in 3828.076 ms
Beginning run #9...completed in 3828.076 ms
Beginning run #10...completed in 578.1176 ms
Beginning run #11...completed in 3796.8264 ms
Beginning run #12...completed in 3828.076 ms
Beginning run #13...completed in 3828.076 ms
Beginning run #14...completed in 3828.076 ms
Beginning run #15...completed in 3828.076 ms
Beginning run #16...completed in 3828.076 ms
Beginning run #17...completed in 546.868 ms
Beginning run #18...completed in 3828.076 ms
Beginning run #19...completed in 3828.076 ms
Beginning run #20...completed in 546.868 ms
Total time: 61165 ms
Average time per request: 3058 ms
Мне кажется странным, что существует множество повторяющихся значений, вплоть до очень маленького уровня. Есть ли какое-то узкое место, из-за которого оно будет возвращаться в одно и то же время неоднократно?
... надеюсь, мой код для определения и отображения длительности в миллисекундах не выключен, но объект TimeSpan отслеживает его локально для каждого цикла, поэтому я не думаю, что это так.
РЕДАКТИРОВАТЬ: Джон спросил код синхронизации, так что поехали (имена переменных изменены, чтобы защитить проприетарные, так что, возможно, что-то упитанное, что сделает это не компилировать) ...
int totalRunTime = 0;
for (int i = 0; i < numberOfIterations; i++)
{
Console.Write("Beginning run #" + (i + 1).ToString() + "...");
DateTime start = DateTime.Now;
SimpleService ws = new SimpleService();
DataSet ds = ws.CallSomeMethod();
DateTime end = DateTime.Now;
TimeSpan runTime = end - start;
totalRunTime += (int)runTime.TotalMilliseconds;
Console.Write("completed in " + runTime.TotalMilliseconds.ToString() + " ms\n");
}
Console.WriteLine("Total time: " + totalRunTime.ToString() + " ms");
Console.WriteLine("Average time per request: " + (totalRunTime / numberOfIterations).ToString() + " ms\n");