Pergunta

Em C ++ posso declarar um método "inline" e o compilador é provável que inline. Tanto quanto eu entendo não existe tal palavra-chave em Java.

Inlining é feito se o JVM decidir fazê-lo? Posso influenciar essa decisão de alguma forma?

Foi útil?

Solução

Um par das outras respostas sugeriram que apenas métodos final pode ser embutido - isto não é verdade, como HotSpot é inteligente o suficiente para ser capaz para inline métodos não-final, desde que eles não têm sido substituído ainda . Quando uma classe é carregada que substitui o método, que pode desfazer a sua optimização. Obviamente fazendo a média final método que não é necessário ...

Basicamente deixar o JVM fazer o seu trabalho. - É provável que seja muito melhor em trabalhar para fora onde inline do que você é

Você tem uma situação onde você está convencido de que a JVM não está fazendo um bom trabalho? Supondo que você está usando HotSpot, você já tentou usar a versão do servidor em vez do cliente? Isso pode fazer um enorme diferença.

Outras dicas

Embora o compilador Java pode fazer inline (para métodos de curto early-bound) a real Inlining será feito pelo compilador JIT. O JIT (HotSpot) compilador será capaz de, até mesmo, em linha virtuais métodos. A melhor maneira de interagir com ele é escrever um simples e concisa código. Muito provavelmente, o código que usa a reflexão não vai permitir inlining.

Espero que ajude.

'Em C ++ posso declarar um método "inline" e o compilador irá inline' ... ou não. O compilador é livre para fazer a linha função ou não, e você não pode realmente afetar o resultado. É apenas uma dica para o compilador.

Em Java não existe tal coisa, o compilador (e mais tarde o VM enquanto executa otimizações) pode decidir 'inline' o método.

Note-se que final métodos têm mais possibilidades de ser embutido (o compilador podem métodos não embutido não finais, uma vez que podem ser substituídos em classes derivadas). Com VM moderna, uma otimização semelhante pode ser feita em tempo de execução. A bandeira vontade VM do tipo (para que ele possa executar verificações de tipo) e inline código. Só se a verificação falhar, ele vai cair de volta para a chamada de método polimórfico unoptimized originais.

Inlining é mais provável de acontecer se o método em questão é a seguinte:

  • curto
  • final
  • não dependente de qualquer comprimento, métodos não finais

Como estas são as únicas circunstâncias em que a JVM pode ter certeza dos efeitos da chamada.

class A {
    final int foo() { return 3; }
}

Dada esta classe, qualquer chamada para foo () pode ser substituída com a constante "3". Qualquer máquina virtual java1 pode fazer isso, porque os final palavra-chave explicitamente ditames que não é possível ter uma subclasse que substitui "foo int ()".

Inlining o método oferece os seguintes benefícios no site da chamada:

  • Não chamada de método
  • No dinâmica expedição
  • Possível constante vezes o valor, por exemplo. "A.foo () + 2" se torna 5 com nenhum código executado no
    tempo de execução.

No passado, os programadores muitas vezes inserido o final palavra-chave exatamente por esta razão . Ou para melhor facilitar inlining e velocidade aumento execução, eles iriam combinar vários métodos menores em um método maior. Mas, em muitos aspectos, tais técnicas derrotar toda a instalação de modularização e reutilização construído na linguagem de programação.

Modern JVM, como o Java HotSpot VM é capaz de inline classe sem o final . palavra-chave **.

( http://java.sun.com/developer/ technicalArticles / Networking / HotSpot / inlining.html )

Leia este para o comportamento Inlining. http://www.javacoffeebreak.com/articles/thinkinginjava/comparingc++ andjava.html

Ele diz métodos finais pode ser embutido, mas nem sempre.

Sim, se a JVM decide fazê-lo, ele pode. Maneiras de influenciar incluem a definição do método como estático ou como final.

Claro, a coisa mais importante sobre isso é que a estrutura das necessidades método a ser em linha amigável. Curto ajuda, mas o mais importante precisa apenas de usar suas variáveis ??locais e seus parâmetros, há campos e chamadas de método mínimas para outros métodos na mesma classe.

No entanto, você não deve olhar para fazer tais otimizações prematuramente, você realmente pode ser tornar as coisas piores (porque você poderia ser um curto-circuito outras otimizações possíveis). O JVM, às vezes, perceber que um método pode ser embutido sem essas dicas.

Ao comparar uma função normal e função final (que está a ser dito em linha por JVM), tenho visto que não há nenhuma melhoria de desempenho entre eles. Talvez sobrecarga de chamada de função já é muito baixa.

Nota: Eu caixa esbater algoritmo de avaliação de desempenho utilizados

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