Por que o ASP.NET re-compilação (re-JIT) tudo quando apenas mudanças de uma coisa?

StackOverflow https://stackoverflow.com/questions/663466

  •  20-08-2019
  •  | 
  •  

Pergunta

Tenho uma aplicação ASP.NET 2.0 (instalado no IIS 6.0 a partir de um MSI) que foi compilado como um "web site", e pré-compilados / embalados usando um projeto de implantação da web, no Visual Studio 2005. (pus na um pedido para os desenvolvedores a considerar a mudança para uma aplicação web para a próxima versão, mas isso não vai mudar para esta versão).

Sempre que o aplicativo é reciclado (por exemplo, uma alteração é feita para o web.config), no primeiro hit, EIC ASP.NET da aplicação. Como parte deste, que leva todas as assembléias necessárias para a página de login e compila-los em código nativo na Temporary ASP.NET Files 'assembly \ DL3' diretório, que leva entre 20 e 60 segundos. Isso só acontece em uma reciclagem, o que raramente acontece -. Mas quando isso acontecer, ele faz com que a página para levar muito mais tempo para carregar, e eu acredito que pode ser possível para otimizar esse

Parece haver 122 DLLs que ele precisa para considerar, alguns dos quais são o código-behind pré-compilados, outros são componentes de terceiros para o site (por exemplo, NHibernate.dll, componentes de relatórios, etc.)

Por que recompilar / re-JIT tudo ? Por que ele não detectar que a maioria das assembleias não mudaram, e não tentar mudá-los? Posso provar que não é a compilação de lote que está causando o problema? (Eu tenho <compilation debug="false"> definido no web.config).

Outras questões sugerem NGEN pode ser útil, mas eu li que não é possível usá-lo em 1.x ASP.NET; estamos usando 2.0 e não consigo encontrar uma resposta limpa de qualquer maneira.

Foi útil?

Solução

Da minha experiência pessoal reciclagem lenta é frequentemente causada por NHibernate / ActiveRecord se você tiver lotes de entidades. Consulte http://nhibernate.info/blog /2009/03/13/an-improvement-on-sessionfactory-initialization.html para explicação solução + possível.

Outras dicas

Você está executando IIS? Estou bastante certo de que, se você reiniciar o site no IIS ele vai pegar qualquer alteração configurações sem copiar as DLLs.

Você pode ser capaz de melhorar o seu tempo de reciclagem através da instalação de DLLs comuns que a mudança raramente - tais como NHibernate ou ferramentas de relatórios - no GAC. Isso deve impedir que sejam re-JITted.

Como: Instalar um assembly no Cache de Assembly Global

É estranho que só copiar a dll leva 20 segundos. Gostaria de sugerir a fazer outra verificação e certificar-se de onde o gargalo é.

Como você pode estar certo de que tudo está no estado adequado sem reciclagem / redefinir (ou o que acontece) o AppDomain? Imagem que você tem algo em início de aplicação (global.asax), que define o valor de um campo estático com base em um valor de configuração. A menos que você reiniciar todo o AppDomain você não pode ter certeza.

Outra razão:. Não há nenhuma maneira de descarregar um .NET dll uma vez que sua carregado, então você tem que recriar o domínio de aplicativo quando algo é atualizado

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top