Pergunta

Estou interessado na otimização em tempo de execução por um VM e em tempo de compilação. Eu tive a idéia de que otimizações são mais eficiente e mais fácil em tempo de compilação.

No entanto, o meu pensamento parece ser falso em determinadas circunstâncias. Isto é evidente na de Steve Yeggie citado por Daniel

[O] ptimization é muitas vezes mais fácil quando realizada em tempo de execução por um inteligente máquina virtual - -.

Por que é a otimização mais fácil quando realizada em tempo de execução por uma VM do que em tempo de compilação?

Foi útil?

Solução

Resposta curta:. Porque é mais fácil de identificar e analisar em tempo de execução dos hotspots - as partes do seu programa que estão usando a maior parte do tempo

Resposta longa:

Se você começar a executar o código no modo de interpretar uma máquina virtual pode contar quantas vezes e quanto tempo diferentes partes do código são usados. Estas peças podem ser otimizados melhor.

Tome aninhados if-then-else-cláusulas. verificações boolean menos precisa menor tempo de execução. Se você otimizar o caminho para o papel, que é executado com mais freqüência, você pode obter tempo de execução melhor no geral.

Outro ponto é que, em tempo de execução que você pode fazer suposições, que são impossíveis em tempo de compilação. O Java VM para inlines instância em métodos virtuais de modo servidor - contanto apenas uma classe é carregada, que implementa estes método. Isso seria perigoso, se feito em tempo de compilação. O JVM deoptimizes o código novamente, se outra classe é carregada, mas muitas vezes isso não acontece.

Também em tempo de execução é mais conhecido sobre a máquina o programa é executado. Se você tem uma máquina com mais registos você pode usá-los. Novamente, isto não é seguro, se feito em tempo de compilação.

Uma coisa a dizer: otimização em tempo de execução tem também desvantagens. Mais importante: o tempo para as otimizações é adicionado ao tempo de execução do programa. Também é mais complicado, porque você tem que compilar partes do programa e os executa. Bugs na máquina virtual são críticos. Pense em um compilador, que às vezes falhar - você pode compilar novamente e está tudo bem. Se uma VM trava às vezes, significa que o programa está falhando algumas vezes. Não é bom.

Como conclusão: Você pode fazer todos os otimização em tempo de execução, o que é possível em tempo de compilação ... e um pouco mais. Você tem mais informações sobre o programa, a sua execução-caminhos ea máquina o programa está em execução. Mas você tem de levar em consideração o tempo necessário para executar as otimizações. Também é mais complicado de fazer em tempo de execução e as falhas são mais relevantes do que em tempo de compilação.

Outras dicas

Porque não há mais informações disponíveis em tempo de execução. Por exemplo CPU exata, sistema operacional e outros detalhes do ambiente são conhecidas. Esta informação tem um efeito sobre a forma como a otimização deve ser feito.

A VM tem código completo do programa e o compilador muitas vezes tem apenas o código parcial por causa da tradução separada de diferentes unidades de tradução. Por conseguinte, o VM tem mais dados para análise.

Porque em tempo de execução que você tem informação extra:. Como a máquina está realizando, limites de memória do seu processo e, provavelmente, mais importante, o código está sendo executado e quantas vezes

Essas coisas lhe permitem fazer otimizações de tempo de execução que você simplesmente não pode fazer em tempo de compilação.

a VM pode reunir estatísticas para otimizar, da mesma forma um banco de dados faz do seu uso.

mantendo continuamente estatísticas e verificar invariantes também são sobrecarga de tempo de execução de fragmentos compiladas ou interpretadas. Se você não pode otimizar rápida e bem o suficiente, não se incomode. Eu não acho que é mais fácil de obter quaisquer resultados melhores fazendo isso o tempo de execução em vez de tempo de compilação. Eu acho que é ainda mais difícil considerando a complexidade de uma boa implementação.

Assim como o equívoco comum de suficientemente bons compiladores de otimização, gerando melhor montagem do que os humanos, suficientemente inteligente VM pode precisar de ser maldito demasiado inteligente para executar mais rápido.

Algo de reconhecer é que ele não é o conceito de uma máquina virtual que permite otimizações de tempo de execução, é o fato de que muitas VMs não jogue fora o meta-dados do programa original e têm construído em funcionalidade para a reflexão. Um termo mais apropriado para uso seria uma "biblioteca de tempo de execução" pode fazer melhor do que otimizações otimizações estáticos sozinhos; isso se aplica a línguas não-VM como C.

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