Existe uma maneira de fazer cumprir a função inlining em c #?
-
05-07-2019 - |
Pergunta
Tanto quanto eu sei que não há nenhuma maneira de sugerir que o compilador c # para inline uma função particular e eu acho que é como que por design.
Eu também acho que não deixar o programador para especificar o que inline eo que não é geralmente uma boa idéia, pois isso implicaria que você pensa que é mais esperto do que o compilador JIT (meus respeitos para aqueles que realmente são), mas, o que se eu quisesse especificar que uma parte crítica de código precisa ser extremamente rápido a qualquer custo, não importa como alcançá-lo na máquina de destino? Como de ainda você não pode fazer tal coisa e me pergunto se tanto a linguagem C # e o JIT nunca vai suportar esta funcionalidade.
No meu caso, eu sei o que a máquina de destino é, e eu sei que a função inlining vai ajudar a melhorar o desempenho. Isso deixa-me pensar que a única maneira de fazer cumprir a função inlining é conhecer em que circunstâncias o JIT irá fazê-lo, mas eu não acho que é uma boa idéia também,
Qualquer luz sobre o assunto seria muito apreciada.
Graças.
Solução
A situação mudou um pouco com o advento do .Net 4.5.
Agora você pode decorar um método com o atributo [MethodImplAttribute(MethodImplOptions.AggressiveInlining)]
que fará com que ele ser embutido pelo JIT, se possível.
Veja este blog para mais detalhes.
Outras dicas
Resposta curta: não
Long resposta: http: //blogs.msdn. com / ericgu / Arquivo / 2004/01/29 / 64644.aspx
Critérios para inlining: http: //blogs.msdn .com / davidnotario / Arquivo / 2004/11/01 / 250398.aspx e http://blogs.msdn.com/ericgu/archive/2004/01/29/64717.aspx
Note que nos dois últimos links sobre critérios para inlining, aquela sobre estruturas não ser inlines é out-of-date; informações atualizadas podem ser encontradas em: http://blogs.msdn.com/vancem/archive/2008/05/12/what-s-coming-in-net-runtime-performance-in -version-v3-5-sp1.aspx
Recentemente aferido o seguinte:
http://www.gfilter.net/junk/BubblesortBenchmark.jpg (Superior é pior)
Como você pode dizer, o CLR eo JVM são ambos muito melhor no método inlining do que você jamais será.
if(performance < ACCEPTABLE){
if(profiler.showsAffectOfMethodCallOverhead() && seriouslyWeDoubleChecked()){
if(runtimeContext.isReallyStableAndNotProneToChange() && weNeedToGetThisThingBatOutOfHellFast()){
return thisIsOneOfTheFewTimesWhenANativeExternalFunctionMayBeWorthIt();
}
}
}
return dontWorryAboutIt();
Se você está executando esse caminho raro, quebrar o seu C ou ASM.