Pergunta

Nossa aplicação leva muito mais tempo para iniciar após um reboot (arranque a frio) do que se ele já foi aberta uma vez (arranque a quente).

A maioria (se não todos) a diferença parece vir de DLLs de carga, quando as DLLs' estão em páginas de memória cache que carregar muito mais rápido. Tentamos usar Clearmem para simular a reinicialização (desde a sua muito menos tempo consumindo do que realmente reiniciar) e obteve resultados mistos, em algumas máquinas parecia para simular um reboot muito consistente e em outros não.

Para resumir minhas perguntas são:

  1. Você já experimentou as diferenças de tempo de lançamento entre frio e começa quentes?
  2. Como você delt com essas diferenças?
  3. Você sabe de uma maneira de dependably simular um reboot?

Editar:

Os esclarecimentos para comentários:

  • A aplicação é na maior parte C ++ nativo com alguns NET (.NET o primeiro conjunto que é carregado para o pagador CLR).
  • Nós estamos olhando para melhorar o tempo de carga, obviamente, nós fizemos a nossa quota de criação de perfil e melhorou os hotspots em nosso código.

Algo que eu esqueci de mencionar foi que conseguimos algumas melhorias por re-basear todos os nossos binários de modo que o carregador não tem que fazê-lo em tempo de carregamento.

Foi útil?

Solução

Como você o perfil de seu código? Nem todos os métodos de criação de perfil são iguais e alguns hotspots encontrar melhor do que outros. Você está colocando um monte de arquivos? Se assim for, a fragmentação do disco e tempo de busca pode entrar em jogo.

Talvez até mesmo furando informações básicas tempo no código, escrevendo para um arquivo de log e examinar os arquivos no frio / partida a quente vai ajudar a identificar , onde o aplicativo é passar o tempo.

Sem mais informações, eu inclinar-se para cache do sistema de arquivos / disco como a provável diferença entre os dois ambientes. Se for esse o caso, então você quer necessidade de gastar o carregamento de arquivos menos tempo inicial, ou encontrar mais rápido maneiras de carregar arquivos.

Exemplo: se você é lotes de carregamento de arquivos de dados binários, acelerar o carregamento, combinando-os em um único arquivo, em seguida, fazer uma slerp de todo o arquivo na memória de uma leitura e analisar seus conteúdos. Menos buscas em disco e passar o tempo lendo fora de disco. Mais uma vez, talvez isso não se aplica.

Eu não sei offhand de quaisquer ferramentas para limpar o disco / filesystem cache, mas você poderia escrever uma aplicação rápida de ler um monte de arquivos não relacionados fora do disco para fazer com que o cache do sistema de arquivos / disco para ser carregado com informações diferentes .

Outras dicas

Como para simular reboots, você já pensou em correr a sua aplicação a partir de um Virtual PC ? Usando virtualização você pode facilmente replicar um conjunto de condições mais e outra vez.

Eu também iria considerar algum tipo de profiling aplicativo de detectar o pedaço de código fazendo com que o tempo lag, e depois de fazer a chamada julgamento sobre quanto desse código é realmente necessário, ou se ele poderia ser conseguido de uma maneira diferente.

Seria difícil para simular realmente um reboot no software. Quando você reiniciar, todos os dispositivos em sua máquina começar a sua parte de reset afirmou, o que deve causar todo o sistema em toda a memória para ser perdida.

Em uma máquina moderna você tem memória e caches em toda parte: há o subsistema de VM que é armazenar páginas de memória para o programa, então você tem o OS cache o conteúdo dos arquivos na memória, então você tem o em disco tampão de setores no disco rígido em si. Você provavelmente pode obter os caches OS para ser reposto, mas o buffer em disco na unidade? Eu não sei de uma maneira.

Morten Christiansen disse:

Uma forma de aplicativos make começar de arranque a frio mais rápida (tipo de) é usado por exemplo Adobe reader, carregando alguns dos arquivos na inicialização, escondendo assim o arranque a frio dos usuários. Isso só é utilizável se o programa não é suposto para começar imediatamente.

Isso faz com que o cliente pagar para inicializar a nossa aplicação em cada inicialização, mesmo quando ele não é usado, eu realmente não gosto dessa opção (nem o Raymond ).

Uma maneira bem sucedida para acelerar a inicialização do aplicativo é mudar DLLs para atraso de carga. Esta é uma mudança de baixo custo (alguns brincar com as configurações do projeto), mas pode fazer a inicialização significativamente mais rápido. Em seguida, execute depends.exe no modo de figura de perfil quais DLLs carregados durante a inicialização de qualquer maneira, e reverter o atraso de carga sobre eles. Lembre-se que você também pode atrasar-load mais DLLs do Windows que você precisa.

Uma técnica muito eficaz para melhorar o tempo de lançamento fria aplicativo é otimizar ligação função de ordenação.

O vinculador Visual Studio permite passar em listas de arquivos todas as funções no módulo a ser ligados (ou apenas alguns deles - não tem que ser todos eles), e o vinculador irá colocar essas funções ao lado outro de memória no.

Quando o aplicativo está sendo iniciado, há normalmente chama para o init funções em sua aplicação. Muitas destas chamadas será para uma página que não está na memória, no entanto, resultando em uma falha de página e um disco procuram. É aí que a inicialização lenta vem.

Otimizando seu aplicativo para todas estas funções estão juntos pode ser uma grande vitória.

Confira perfil de otimização guiada em Visual Studio 2005 ou posterior. Uma das coisa sthat PGO faz para você é o link função de ordenação.

É um pouco difícil de trabalhar em um processo de construção, porque com PGO você precisa link, executar o aplicativo, e depois com a saída do perfil de execução-link novamente. Isso significa que suas necessidades de processo de compilação para ter um ambiente de tempo de execução e lidar limpeza após mau constrói e tudo isso, mas a recompensa é tipicamente 10+ ou lançamento mais rápido frio sem alterações no código.

Há mais algumas informações sobre PGO aqui:

http://msdn.microsoft.com/en-us/library /e7k32f4k.aspx

Como alternativa à lista de ordem função, apenas o código de grupo que será chamado dentro das mesmas seções:

#pragma code_seg(".startUp")
 //...
#pragma code_seg

#pragma data_seg(".startUp")
 //...
#pragma data_seg

Deve ser fácil de manter, como as alterações de código, mas tem o mesmo benefício como a lista de ordem função.

Não estou certo se lista de ordem função pode especificar variáveis ??globais bem, mas usar este #pragma data_seg simplesmente trabalho.

Uma forma de aplicativos make começar de arranque a frio mais rápida (tipo de) é usado por exemplo Adobe reader, carregando alguns dos arquivos na inicialização, escondendo assim o arranque a frio dos usuários. Isso só é utilizável se o programa não é suposto para começar imediatamente.

Outra nota, é que o .NET 3.5SP1 supostamente tem muito maior velocidade de arranque a frio, embora o quanto, eu não posso dizer.

Poderia ser as NICs (placas de rede) e que a sua aplicação depende de alguns outros serviços que requerem a rede para chegar. Assim, o perfil de seu aplicativo sozinho não pode muito dizer isso, mas você deve examinar as dependências para a sua aplicação.

Se a sua aplicação não é muito complicado, você pode simplesmente copiar todos os arquivos executáveis ??para outro diretório, que deve ser semelhante a uma reinicialização. (Cortar e Colar não parece trabalho, o Windows é bastante inteligente para saber os arquivos mover para outra pasta é armazenada em cache na memória)

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