Aposto que eu mesmo poderia responder se soubesse mais sobre as ferramentas para analisar como o C # / JIT se comporta, mas como não o faço, por favor, pergunte.
Eu tenho um código simples como este:
private SqlMetaData[] meta;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private SqlMetaData[] Meta
{
get
{
return this.meta;
}
}
Como você pode ver, eu coloquei AggressiveInlining porque acho que deveria estar embutido.
Eu acho que. Não há garantia de que o JIT incluiria o contrário. Estou errado?
Poderia fazer esse tipo de coisa prejudicar o desempenho / estabilidade / qualquer coisa?
c#
performance
meta-programming
Sarja
fonte
fonte
Respostas:
Compiladores são bestas inteligentes. Geralmente, eles extraem automaticamente o máximo de desempenho possível de qualquer lugar que puderem.
Tentar enganar o compilador geralmente não faz uma grande diferença e tem muitas chances de sair pela culatra. Por exemplo, inlining torna seu programa maior, pois duplica o código em todos os lugares. Se sua função for usada em muitos lugares ao longo do código, poderá ser prejudicial, como apontado @CodesInChaos. Se for óbvio que a função deve ser incorporada, você pode apostar que o compilador fará isso.
Em caso de hesitação, você ainda pode fazer as duas coisas e comparar se houver algum ganho de desempenho, essa é a única maneira certa até agora. Mas minha aposta é que a diferença será negligenciável, o código fonte será apenas "mais barulhento".
fonte
struct
s como parâmetros - onde, em muitos casos, deveria e poderia. Além de perder centenas de otimizações óbvias - incluindo, entre outras, evitar verificações e alocações desnecessárias de limites, entre outras coisas.Você está certo - não há como garantir que o método seja incorporado - Enumeração MSDN MethodImplOptions , SO MethodImplOptions.AggressiveInlining vs TargetedPatchingOptOut .
Os programadores são mais inteligentes que um compilador, mas trabalhamos em um nível superior e nossas otimizações são produtos do trabalho de um homem - o nosso. Jitter vê o que está acontecendo durante a execução. Ele pode analisar o fluxo de execução e o código de acordo com o conhecimento colocado por seus projetistas. Você pode conhecer melhor o seu programa, mas eles conhecem melhor o CLR. E quem será mais correto em suas otimizações? Não sabemos ao certo.
É por isso que você deve testar qualquer otimização que fizer. Mesmo que seja muito simples. E leve em consideração que o ambiente pode mudar e sua otimização ou des otimização pode ter um resultado inesperado.
fonte
Edição: Eu sei que a minha resposta não respondeu exatamente a pergunta, embora não haja desvantagem real, dos meus resultados de tempo também não há vantagem real. A diferença entre um getter de propriedades embutido é de 0,002 segundos em 500 milhões de iterações. Meu caso de teste também pode não ser 100% exato, pois está usando uma estrutura, porque existem algumas ressalvas no jitter e alinhamento com estruturas.
Como sempre, a única maneira de realmente saber é escrever um teste e descobrir. Aqui estão meus resultados com a seguinte configuração:
Projeto vazio com as seguintes configurações:
Resultados
Testado com este código:
fonte
Os compiladores fazem muitas otimizações. Inlining é um deles, quer o programador queira ou não. Por exemplo, MethodImplOptions não tem uma opção "embutido". Porque o embutimento é feito automaticamente pelo compilador, se necessário.
Muitas outras otimizações são feitas especialmente se ativadas nas opções de compilação, ou o modo "release" fará isso. Mas essas otimizações são do tipo "funcionou para você, ótimo! Não funcionou, deixe" otimizações e geralmente oferecem melhor desempenho.
é apenas um sinalizador para o compilador de que uma operação embutida é realmente necessária aqui. Mais informações aqui e aqui
Para responder sua pergunta;
Verdade. Nenhuma garantia; Nem o C # tem uma opção "forçar a inclusão".
Nesse caso, não, como é dito em Gravando aplicativos gerenciados de alto desempenho: uma cartilha
fonte