2009-03-19 7 views
4

J'ai une application ASP.NET 2.0 (installée sur IIS 6.0 à partir d'un MSI) qui a été compilée en tant que «site web», et précompilée/empaquetée à l'aide d'un projet de déploiement Web dans Visual Studio 2005. (J'ai mis en demande aux développeurs d'envisager de passer à une application web pour la prochaine version, mais cela ne changera pas pour cette version).Pourquoi ASP.NET re-compile (re-JIT) tout quand une seule chose change?

Chaque fois que l'application est recyclée (par exemple, une modification est apportée au web.config), au premier coup, ASP.NET JIT l'application. Dans ce cadre, il prend tous les assemblys requis pour la page de connexion et les compile en code natif dans le répertoire Assembly \ dl3 'des fichiers temporaires ASP.NET, ce qui prend entre 20 et 60 secondes. Cela ne se produit que sur un recyclage, ce qui arrive rarement, mais quand c'est le cas, le chargement de la page prend beaucoup plus de temps et je crois qu'il est possible d'optimiser cela.

Il semble y avoir 122 DLL dont il a besoin à considérer, dont certains sont le précompilé code-behind, d'autres sont des composants tiers pour le site Web (par exemple, NHibernate.dll, composants de rapports, etc.)

Pourquoi recompile-t-il/re-JIT tout? Pourquoi ne détecte-t-il pas que la plupart des assemblées n'ont pas changé et n'essaie pas de les changer? Puis-je prouver que ce n'est pas la compilation par lots qui cause le problème? (Je ai <compilation debug="false"> définir dans le web.config.)

Other questions suggérer NGEN pourrait être utile, mais j'ai lu qu'il n'est pas possible de l'utiliser sur ASP.NET 1.x; nous utilisons 2,0 et je ne peux pas trouver une réponse claire de toute façon.

Répondre

2

De mon expérience personnelle recyclage lente est souvent causée par NHibernate/ActiveRecord si vous avez beaucoup d'entités. Voir http://nhibernate.info/blog/2009/03/13/an-improvement-on-sessionfactory-initialization.html pour l'explication + solution possible.

+0

Nice find, +1. J'essaie de trouver un patch pour NH (nous n'utilisons pas Castle) pour voir si nous pouvons obtenir le gain ici aussi. Pourriez-vous en avoir un? – crb

+0

Malheureusement non, mais je vais essayer de l'ajouter à Fluent NHibernate bientôt. Aucune promesse cependant. – felixg

+0

Heh. Tous ces correctifs dans les nouveaux modèles NH que je ne peux pas utiliser dans l'ancienne version de notre produit commercial. Je préfère de loin le monde de mise à jour rapide OSS :) – crb

2

Exécutez-vous IIS? Je suis à peu près certain que si vous redémarrez votre site dans IIS, il détectera les modifications apportées aux configs sans copier les dll.

+0

Oui, l'application s'exécute sous IIS 6.0. L'action de changer la config l'amène à re-copier toutes les DLLs; Je ne suis pas sûr si vous faites le changement avec IIS arrêté, ce que la sortie est. – crb

+0

Hmm, vraiment. Eh bien, rien. (J'ai très peu d'expérience IIS, et j'ai seulement utilisé IIS7) –

0

Il est étrange que la seule copie de la DLL dure 20 secondes. Je suggère de faire un autre contrôle et de s'assurer où le goulot d'étranglement est.

+0

Ce n'est pas une DLL, c'est 122 d'entre eux. 26 Mo de valeur. Cela prendra toujours du temps. mon point était je préférerais ne pas le faire s'ils n'ont pas changé! – crb

+0

Dans une norme HD 26 Mo devrait être copié en 2-3 secondes. Je suppose que le problème est la pré-compilation de l'application et tout le code d'initialisation que vous pouvez avoir dans le démarrage de l'application. – Albert

+0

Vous avez raison, il a copié le répertoire à peu près à ce moment-là. Cependant, je ne peux pas dire ce qu'il fait d'autre à ce moment-là, à partir de n'importe quoi d'autre que la sortie Process Monitor, donc je suis intéressé par d'autres idées ... – crb

0

Comment pouvez-vous être certain que tout est dans l'état correct sans recyclage/réinitialisation (ou quoi qu'il arrive) l'AppDomain? Imaging que vous avez quelque chose dans l'application commence (global.asax) qui définit la valeur d'un champ statique basé sur une valeur de configuration. Sauf si vous réinitialisez l'AppDomain entier, vous ne pouvez pas être sûr.

Une autre raison: Il n'y a aucun moyen de décharger une DLL .NET une fois qu'elle est chargée, donc vous devez recréer le domaine de l'application quand quelque chose est mis à jour.