Pergunta

Eu estou me referindo a esta discussão.Eu nunca ter escrito qualquer código em C ou C++ .Eu não tenho qualquer CS plano de fundo.No entanto, tenho vindo a trabalhar como programador Java por 5 anos e agora decidi aprender mais sobre CS e fazer algumas catching up.

Foi útil?

Solução

Ao executar uma determinada peça de código, sempre que você chama uma função padrão, o tempo de execução é um pouco mais alto do que despejar lá o código contido nessa função. Dumping toda vez que todo o código contido em uma função é do outro lado inadequado, porque obviamente leva a toda uma bagunça de duplicação de código.

Inline resolve o problema de desempenho e manutenção, permitindo que você declare a função como em linha (pelo menos no C ++), para que, quando você chama essa função - em vez de ter seu aplicativo pulando em tempo de execução - o código na função embutido é injetado no tempo de compilação sempre que a função fornecida é chamada.

A desvantagem disso é que - se você embalar grandes funções que você chama muitas vezes - o tamanho do seu programa pode aumentar significativamente (Melhores Práticas sugerir fazê -lo apenas em pequenas funções).

Outras dicas

http://en.wikipedia.org/wiki/inlining

Na computação, a expansão embutida, ou inline, é uma otimização do compilador que substitui um local de chamada de função pelo corpo do callee. Essa otimização pode melhorar o uso do tempo e do espaço em tempo de execução, com o possível custo de aumentar o tamanho do programa final.

Como desenvolvedor de Java, você geralmente não precisa se preocupar com o método inline. O compilador just-in-time de Java pode e fará isso automaticamente na maioria dos lugares onde faz sentido.

IDEs como o Eclipse podem ter um recurso que permite que você faça métodos embutidos no nível do código -fonte - Nunca Faça isso para desempenho, apenas para legibilidade do código (por exemplo, quando você perceber que o método chama outro método sem adicionar nada útil).

Norman Maurer explica em seu blog JVM e JIT inline funcionalidade como que

Inlining é uma técnica que, basicamente, "inline" um método em outro e assim livrar-se de uma invocação de método. O JIT detecta automaticamente o "quente" métodos e tentar inline-los para você. Um método é considerado "quente" se ela foi executada mais de X vezes, onde X é um limite que pode ser configurado usando uma JVM bandeira quando a partida java (10000 é o padrão).Isto é necessário, pois inlining todos os métodos iria fazer mais mal do então qualquer outra coisa, por causa da enorme produzido byte-code.Além disso, o JIT pode "reverter" anterior entre linhas de código quando uma otimização acaba por ser errado em um estado posterior.Lembre-se de que o JIT significa Apenas no Tempo e, portanto, otimizar (que inclui inlining, mas também outras coisas), enquanto que para executar o seu código.

Também com um aviso

Mas, mesmo se a JVM considerar um método para ser "quente", ele pode não inline-lo.Mas por quê?Uma das razões mais prováveis é que é apenas para grandes para obter embutidos.

E você pode encontrar uma forma muito simples exemplo de código para inlining um código Java em Eva Andreasson's Java Mundial dos correios.Você pode encontrar a parte relacionada do post abaixo.

Muitas otimizações tentar eliminar máquina-nível de instruções de salto (por exemplo, JMP para a arquitectura x86).Uma instrução de salto altera o ponteiro de instrução registrar e, assim, transfere o fluxo de execução.Esta é uma operação dispendiosa em relação a outras instruções de MONTAGEM, que é por que ele é um alvo comum para reduzir ou eliminar. Muito útil e bem conhecido de otimização que visa isso é chamado de inlining. Desde jumping é caro, pode ser útil inline muitas chamadas frequentes para pequenas métodos, com diferentes entrada de endereços, para a função de chamada.O código Java em Listagens de 3 a 5 exemplifica os benefícios de inlining.

A listagem 3.Método chamador

int whenToEvaluateZing(int y) {
   return daysLeft(y) + daysLeft(0) + daysLeft(y+1);
}

Listagem 4.Chamado de método

int daysLeft(int x){
   if (x == 0)
      return 0;
   else
      return x - 1;
}

Listagem 5.Antes, método

int whenToEvaluateZing(int y){
   int temp = 0;

   if(y == 0) temp += 0; else temp += y - 1;
   if(0 == 0) temp += 0; else temp += 0 - 1;
   if(y+1 == 0) temp += 0; else temp += (y + 1) - 1;

   return temp; 
}

Em Listagens de 3 a 5 o método de chamada faz três chamadas para um pequenas método, que assumimos para este exemplo de amor é mais benéfico para linha de saltar três vezes.

Pode não fazer muita diferença para linha de um método que é chamado de raramente, mas inlining de um assim-chamado "quente" método que, com freqüência, chamada pode significar uma enorme diferença no desempenho.Inlining também com freqüência torna o caminho para outras otimizações, como mostrado na Listagem 6.

Listagem 6.Depois de inlining, mais otimizações podem ser aplicadas

int whenToEvaluateZing(int y){
   if(y == 0) return y;
   else if (y == -1) return y - 1;
   else return y + y - 1;
}

Como já mencionado em outras respostas, o Inlining tem um custo. Geralmente isso é considerado pequeno, no entanto, quando realmente medindo, você pode se surpreender e aprender que pode ser maior do que você ganha (então O que outras pessoas dizem é verdadeiro: não otimize a menos que você tenha medido).

Vale a pena notar que, no kernel Linux, eles começaram a não iniciar funções originalmente inlagadas há algum tempo porque o custo era muito alto (funções maiores consumiram mais do cache de memória da CPU, e as falhas de cache resultantes eram mais caras do que apenas chamar a função que pretendiam ser inlinhados). Veja "Capítulo 15: a doença em linha" em doc/documentação/process/coding-style.rst para mais detalhes.

Basicamente, em C/C ++, o compilador pode embutir funções, o que significa que, em vez de fazer uma chamada de função para fazer essa operação, o código será adicionado ao bloco da função de chamada, por isso será como se nunca tivesse sido um separado Chamada de função.

Isso entrará em mais detalhes:http://www.codersource.net/cpp_tutorial_inline_functions.html

Inlining refere-se à otimização do tempo de compilação, onde uma pequena função do código será injetada na função de chamada em vez de exigir uma chamada separada.

As respostas de otimização do compilador estão corretas. Há outro uso, no entanto - em reestruturação, Inlining refere -se à substituição de uma chamada de método pelo corpo do método e, em seguida, removendo o método. Ver Método embutido. Existem refatoramentos semelhantes, como Classe embutida.

Editar: observe que a refatoração é feita manualmente ou com uma ferramenta; Em ambos os casos, envolve a alteração do código -fonte.

As funções embutidas são usadas normalmente em arquivos de cabeçalho C ++, não no Java. Um arquivo de cabeçalho C ++ geralmente não contém código implementado e é considerado uma interface para o arquivo CPP com o mesmo nome, que geralmente contém o código implementado. É legal incluir uma função em linha em um arquivo de cabeçalho, geralmente uma pequena função leve. As funções embutidas têm um custo, para que não sejam grandes operações com memória intensiva. Para rotinas pequenas, o desempenho do desempenho é mínimo e é mais usado para conveniência.

Nessa discussão, Jon Skeet menciona o cliente JVM (hotspot) v servidor JVM com as melhorias de desempenho disponíveis em tempo de execução, se o compilador JIT (just-in-time) puder trazer aprimoramentos baseados em tempo. Isso é "como é feito" em Java.

Originalmente, pequenas seções de código que não eram chamadas de muitos lugares seriam "inlinadas" pelo compilador, o que significa que o que era chamado de singleton seria colocado diretamente no caminho do código do ponteiro de instrução, fazendo um ramo de função e custos de retorno mais do que apenas se desenrolar para fazer um loop ou função chamando e colocando as instruções "ali mesmo"

Hoje, Singleton é objeto de discussões com várias páginas e loop-rolling, bem como algo como inline, são um pouco removidas de seus contextos originais. Você pode ler o trabalho muito informado de Dov Bulka sobre o assunto para obter a opinião do assunto C/C ++. Para Java, o estudo de seus ricos em java.util atenda melhor às suas necessidades do que no estudo de questões de compilador profundo - você pode ser pendurado em guerra intramural entrincheirada em estruturas de dados, que encobrem chamadas em código de 16 bits e Não vá acabar com sua curva de aprendizado.

Você pode fazer uma instância em Java, que se assemelha a uma tabela VF (sem calor, por favor), mas pense nisso como você está escrevendo em uma linguagem fortemente digitada - e agora estará escrevendo em um idioma em que a string pode fugir facilmente bisbilhotando por aí onde não tem negócios. Recentemente, tentei escrever código que construiu uma imagem em Java, fazendo isso no código C. Logo me vi olhando para a tabela OXR para uma criptografia forte - que não tem nada a ver com o código que eu estava escrevendo.

Como você escreveria uma classe de string em C/C ++ que possui um pequeno buffer para strings abaixo de 32 bytes e armadilhas para que eles operem apenas na string?

Não está tentando provocá -lo ou qualquer coisa, é apenas um bom lugar para começar, em vez de ciência e compilador.

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