Есть ли способ обеспечить встраивание функций в С#?
-
05-07-2019 - |
Вопрос
Насколько я знаю, нет способа указать компилятору С# на встраивание определенной функции, и я думаю, что это так задумано.
Я также думаю, что не позволять программисту указывать, что встраивать, а что нет, в целом хорошая идея, поскольку это будет означать, что вы думаете, что вы умнее JIT-компилятора (моё уважение тем, кто на самом деле таковым является), но что если бы я хотел указать, что критическая часть кода должна быть чрезвычайно быстрой любой ценой, независимо от того, как этого добиться на целевой машине?Пока что вы не можете этого сделать, и мне интересно, будут ли когда-нибудь поддерживать эту функцию и язык C#, и JIT.
В моем случае я знаю, что такое целевая машина, и знаю, что встраивание функций поможет повысить производительность.Это заставляет меня думать, что единственный способ обеспечить встраивание функций — это узнать, при каких обстоятельствах JIT сделает это, но я тоже не думаю, что это хорошая идея,
Любой свет на эту тему был бы очень признателен.
Спасибо.
Решение
Ситуация немного изменилась с появлением .Net 4.5.
Теперь вы можете украсить метод атрибутом [MethodImplAttribute(MethodImplOptions.AggressiveInlining)]
что приведет к тому, что он будет встроен в JIT, если это вообще возможно.
Видеть этот блог Больше подробностей.
Другие советы
Короткий ответ:нет
Длинный ответ: http://blogs.msdn.com/ericgu/archive/2004/01/29/64644.aspx
Критерии инлайнинга: http://blogs.msdn.com/davidnotario/archive/2004/11/01/250398.aspx и http://blogs.msdn.com/ericgu/archive/2004/01/29/64717.aspx
Обратите внимание, что в последних двух ссылках о критериях встраивания ссылка о том, что структуры не являются встроенными, устарела;обновленную информацию можно найти по адресу: http://blogs.msdn.com/vancem/archive/2008/05/12/what-s-coming-in-net-runtime- Performance-in-version-v3-5-sp1.aspx
Недавно я сравнил это:
http://www.gfilter.net/junk/BubblesortBenchmark.jpg (Выше – хуже)
Как вы можете заметить, CLR и JVM гораздо лучше справляются со встраиванием методов, чем когда-либо.
if(performance < ACCEPTABLE){
if(profiler.showsAffectOfMethodCallOverhead() && seriouslyWeDoubleChecked()){
if(runtimeContext.isReallyStableAndNotProneToChange() && weNeedToGetThisThingBatOutOfHellFast()){
return thisIsOneOfTheFewTimesWhenANativeExternalFunctionMayBeWorthIt();
}
}
}
return dontWorryAboutIt();
Если вы идете по этому редкому пути, используйте C или ASM.