Pergunta

O que é o movimento com inlining funções ou procedimentos em Delphi (especificamente v2010 aqui, mas eu tive o mesmo problema com o Turbo Delphi)?

Há alguma discalimer na ajuda sobre isso pode nem sempre em linha uma função por causa de "certos critérios" whatever that means.

Mas eu descobri que geralmente inlining funções (mesmo as mais simples que têm 3 ou 4 linhas de código) retarda o código em vez de velocidades-lo.

Uma ótima idéia seria uma opção compilador para "tudo inline". Eu não me importo se o meu exe cresce em 50% ou mais para fazê-lo funcionar mais rápido.

Existe uma maneira que eu posso forçar Delphi ao código realmente em linha mesmo se ele não está decidido a ser inlinded pelo compilador? Isso seria realmente ajudar. Caso contrário, você precisa fazer "inlining o manual" de replicar o código do procedimento em todo múltiplas áreas de seu código com comentários como "// Inlining falhou aqui, então se você mudar os próximos 5 linhas, alterá-los nos outros 8 pontos duplicados existe este código "

Todas as dicas aqui?

Foi útil?

Solução

Há uma opção de compilador para inlining automática de rotinas curtas. Em Opções de projeto, em Delphi Compiler -> Compilação -> geração de código, vire "Código inlining controle" para Auto. Esteja ciente, porém, que isso só deve estar em uma compilação de lançamento, uma vez que código inline é difícil de depuração.

Além disso, você disse que não se importa de fazer o seu programa maior, enquanto ele fica mais rápido, mas que muitas vezes inlining torna mais lento. Você deve estar ciente de que isso pode ser parente. Quanto maior for o seu código compilado é, mais erros de cache de instrução que você vai ter, o que retarda a execução.

Se você realmente quiser acelerar o seu programa de cima, executá-lo através de um profiler. Eu recomendo amostragem Profiler , que é gratuito, é feito para trabalhar com código Delphi (incluindo 2010) e doesn' t abrandar o seu execução. Ele vai mostrar-lhe um relatório detalhado do que o código que você está realmente gastando mais tempo executando. Uma vez que você descobriu que, você pode se concentrar sobre os pontos de estrangulamento e tentar otimizá-los.

Outras dicas

Inlining pode tornar as coisas mais lentas em alguns casos. A função inline pode aumentar o número de registros de CPU necessários para variáveis ??locais. Se não há registros suficientes variáveis ??disponíveis serão localizados na memória em vez disso, o que o torna mais lento.

Se a função não está embutido terá (quase) todos os registros de CPU disponíveis.

Descobri que o que não é geralmente uma boa idéia para funções inline contendo loops. Eles vão usar um par de variáveis ??que possam acabar em memória, tornando o código inline mais lento.

Se você quiser força inlining seguida uso incluir arquivos. Você precisa ter certeza de que você declare as variáveis ??corretas, e então usar {$ I filename.inc }. Que sempre vai injetar esse direito código específico onde você quiser, e torná-lo mais fácil de manter, se você precisa alterá-lo.

Tenha em mente que o compilador é escrito por pessoas maneira mais inteligente, em seguida, a maioria dos meros mortais (inclusive eu) e tem acesso a mais informações ao decidir em linha ou não, então quando isso acontece não em linha que provavelmente tem uma boa razão.

Se eu entendi um dos devels compilador FPC (que tem o mesmo problema) corretamente, inlining só pode acontecer quando a rotina para ser em linha já foi compilado.

IOW, se você fizer a unidade com a uma unidade de "folha" inline-a-ser funções, e colocá-lo como o primeiro na cláusula de usos do seu projeto (.dpr), deve ser ok. Note-se que com a unidade de "folha", quero dizer uma unidade que não tem nenhuma dependência em outras unidades do projeto, iow apenas em unidades já compilados.

Eu não ficaria surpreso que era o mesmo em Delphi, dado que compartilha um sistema de unidade com base nos mesmos princípios.

Ele também é bastante unfixable sem violar princípios compilação separada.

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