2010-06-04 13 views
2

Je mesure actuellement le temps passé à charger une page Web à partir d'un programme C#.N'est-ce pas trop rapide pour une page ASP.NET à télécharger en 0 ms?

La solution Visual Studio dispose d'un programme de console et un site Web ASP.NET avec une seule page. Le site Web est hébergé sur ASP.NET Development Server. L'application de la console interroge la page Web comme ceci:

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(); 

La page Web n'a rien de spécial, juste une réponse de la charge et aucun code ASP.NET:

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.Write("Hello World"); 
} 

Maintenant, le chronomètre indique à chaque fois que le code a passé 0 ms. faire tout le travail (interroger le serveur, obtenir la réponse, etc.).

Comment est-ce possible? N'y at-il pas quelque chose qui ne va pas avec ce que je fais? Vraiment, je m'attendais à au moins 10-20 ms. pour exécuter tout le code côté client, puis 100 ms. à:

  • [côté client] Trouver la page d'interroger à partir uri (qui ne nécessite pas la requête DNS, il est donc assez rapide),
  • [côté client] Faites la demande,
  • [côté serveur ] Initialiser moteur ASP.NET,
  • Trouver et lire le fichier .aspx [côté serveur] Traiter la demande,
  • [côté serveur] et exécuter du code compilé (au moins le fichier de lecture peut coûter plusieurs ms.),
  • [côté serveur] Construire la réponse, y compris les en-têtes, puis l'envoyer,
  • [côté client] Recevoir la réponse et la traiter (rognage).

Alors, pourquoi est-il si extrêmement rapide? Y a-t-il un cache difficile qui saute toutes/toutes les étapes et renvoie "Hello World" au client?

S'il y a un cache « caché », où est-il et comment puis-je désactiver pour mesurer le temps « réel » passé?

+1

Comment êtes-vous examing le chronomètre valeur retournée? Examinez-vous la propriété ElapsedMilliseconds? Vous pouvez toujours mettre un sommeil dans le code pour tester que cela fonctionne correctement. Juste parce que c'est sur localhost ne signifie pas qu'il peut appeler la page, attendez qu'il soit rendu et vérifiez la réponse en moins de 1 milliseconde. –

Répondre

1

Oui cela peut et doit être de 0 ms! Parce que votre serveur est sur un localhost. Essayez d'obtenir le serveur ASP.NET ailleurs dans un réseau mondial.

Et vous ne résolvez localhost parce que c'est une adresse constante 127.0.0.1. Et la communication à cette adresse est uniquement gérée par le noyau de votre système d'exploitation.

+0

Ok, il n'y a pas de recherche DNS, pas de tâches lentes liées à la mise en réseau. Mais qu'en est-il du moteur ASP.NET? Est-ce qu'il lit vraiment le fichier .aspx? Est-ce qu'il exécute du code-behind? Je pensais que même lire un fichier d'un octet coûterait quelques millisecondes. –

+0

J'espère que ASP.NET ne prend pas 2 ms/fichier. Parce que cela signifie qu'il ne peut pas gérer plus de 500 requêtes par seconde. Je m'attends à ce que tous les petits fichiers soient mis en cache. – MSalters

+0

Ok, je l'ai trouvé. Je m'excuse, c'était une erreur stupide dans mon code qui a abouti à 0 ms. résultat. Que suggérez-vous? Est-ce que je ferme la question, ou la quitte et accepte la première réponse? BTW, maintenant que le temps est correctement mesuré, il donne 1,1 s, ce qui est assez horrible.D'un autre côté, c'est parce que je suis en mode débogage, donc entrer dans le code ASP.NET peut être très long pour le débogueur. –