Есть ли способ обеспечить встраивание функций в С#?

StackOverflow https://stackoverflow.com/questions/248799

Вопрос

Насколько я знаю, нет способа указать компилятору С# на встраивание определенной функции, и я думаю, что это так задумано.

Я также думаю, что не позволять программисту указывать, что встраивать, а что нет, в целом хорошая идея, поскольку это будет означать, что вы думаете, что вы умнее 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top