Pergunta

Working on .NET me dá bom desempenho em geral para a aplicação em si, mas os tempos de carga iniciais para a minha candidatura são bastante grandes. Um lote de que vai no sentido de conjuntos de carga que é difícil de avaliar.

Há alguma otimizações que eu possa aplicar aos meus montagens para torná-los mais rápido para carregar sem envolver o GAC ou Ngen e os que não estão disponíveis para ClickOnce?

Este é um projeto WinForms 2.0. Eu posso atualizá-lo para um 3,5, mas esse limite a minha base de usuários. Eu tenho .NET Framework 3.5 instalado na minha máquina.

Foi útil?

Solução

Eu criei um muito pequeno .exe que mostra uma tela de abertura o mais cedo possível. Depois que eu inicializar tudo.

Os módulos de cargas JIT-compilador que são chamadas a partir do método que está sendo JITted. Então você tem que tomar cuidado para que o método que mostra a tela inicial, não chama métodos em módulos que você não quer ainda carregado.

Exemplo:

internal sealed class Startup {

    // Call Startup.Run() from Program.Main to start the application
    internal void Run() {
        this.ShowSplash();
        this.ContinueStartup();
    }

    private void ShowSplash() {
        _splash = new Splash();
        _splash.Show();
        Application.DoEvents();
    }

    [MethodImpl(MethodImplOptions.NoInlining)]
    private void ContinueStartup() {
        // Do the startup here
    }
}

O [MethodImpl (MethodImplOptions.NoInlining)] é necessário para o método ContinueStartup () não se inlined pelo JIT, porque isso fará com que os módulos sejam carregados muito cedo.

Outras dicas

Você pode usar ILMerge para juntar todas as suas montagens em um único arquivo. Lendo um arquivo para a memória é mais rápido, então a leitura 10 arquivos. Embora eu duvido que você vai ver uma melhoria real na velocidade de carregamento lá.

Você também pode remover todas as referências a outros conjuntos, carregue o ui para o usuário, e enquanto ele usa a interface do usuário (digitação ou qualquer outra coisa) pré-carregar todas as assembléias necessárias usando Assembly.Load, obter todos os ponteiros função necessária usando reflexão e armazená-los em membros internos. Esta aplicação forma irá carregar muito mais rápido. Mas eu não acho que qualquer pessoa em sã consciência vai fazer otimização como este.

Pode descrever o seu quantas assembleias você tem?

.NET carrega o assembly na mosca quando você precisar deles. Você pode decidir dividir seu aplicativo em várias montagens. Assembléias devem ser divididos por meio de: implantação estratégia, segurança e desempenho. A maioria dos aplicativos são divididos por 3 estrutura em camadas (UI, de negócios, de dados).

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