В настоящее время я измеряю время, затраченное на загрузку веб-страницы из программы на C #.
Решение Visual Studio имеет консольную программу и веб-сайт ASP.NET с одной страницей. Веб-сайт размещен на сервере разработки ASP.NET. Консольное приложение запрашивает веб-страницу следующим образом:
bool isSuccess;
Stopwatch timeSpentToDownloadPage = Stopwatch.StartNew();
WebRequest request = HttpWebRequest.Create(new Uri("http://localhost:12345/Test.aspx", UriKind.Absolute));
request.Timeout = 200;
using (WebResponse response = request.GetResponse())
{
Stream responseStream = response.GetResponseStream();
StreamReader sr = new StreamReader(responseStream);
string responseText = sr.ReadToEnd().Trim();
isSuccess = (responseText == "Hello World");
}
timeSpentToDownloadPage.Stop();
На веб-странице нет ничего особенного, только ответ о загрузке и отсутствие кода ASP.NET:
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("Hello World");
}
Теперь секундомер показывает каждый раз, когда код потратил 0 мс. выполнить всю работу (запросить сервер, получить ответ и т. д.).
Как это возможно? Что-то не так с тем, что я делаю? Действительно, я ожидал не менее 10-20 мс. выполнить весь код на стороне клиента, затем 100 мс чтобы:
- [на стороне клиента] Найти страницу для запроса из uri (которая не требует DNS-запроса, поэтому это довольно быстро),
- [клиентская сторона] Сделайте запрос,
- [сторона сервера] Инициализировать ядро ASP.NET,
- [сторона сервера] Обработка запроса,
- [на стороне сервера] Найти и прочитать файл .aspx и выполнить скомпилированный код (хотя бы чтение файла может стоить несколько мс.),
- [сторона сервера] Построить ответ, включая заголовки, затем отправить его,
- [клиентская сторона] Получите ответ и обработайте его (усечение).
Так почему же это так быстро? Есть хитрый кеш, который просто пропускает все / большинство шагов и возвращает «Hello World» клиенту?
Если есть «скрытый» кэш, где он находится и как его отключить для измерения «реального» затраченного времени?