Непонятный Il-код
Вопрос, который меня давно мучает: зачем компилятор языка C# (csc.exe) из версии .NET Framework 2.x компилирует nop'ы (no operator - т.е. пустые инструкции), причём в некоторых случаях в IL-коде встречается по 6 (и более) подряд идущих nop'ов. Убираю их при помощи дизассемблера ildasm и компилю заново и программа работает также. Эти непонятные nop'ы тока снижают производительность. Ещё встречается такая ситуация, когда инструкция безусловного перехода выполняет прыжок на следующую инструкцию (зачем??).
Судя по всему, какая-то недоработка. С другой стороны мне кажется, что при проходе над IL-кодом JIT'ом, nop'ы должны пропадать и влияния на производительность быть не должно, т.е. байт код на выходе будет в любом случае без лишних nop'ов. Это как пробелы и табуляции для csc. Таким образом, немного падает производительность JIT'а, а может и вообще не падает. Хотя это все, конечно мои предположения.
Как бы то ни было, у нас тут есть человек, который вроде очень хороший спец и он проводит у нас что-то вроде курсов для сертификации. У него и спрошу, но это будет не раньше следующей недели.
Буду рад, если ты приаттачишь пример cs-файла, который на выходе дает много nop'ов. А то лень самому придумывать код, где оно вылезет, или рыться по уже готовому.
.method public hidebysig specialname rtspecialname
instance void .ctor(valuetype CodeGate.WS.Compiler.WS_TOKEN_INFO codeToken) cil managed
{
// Code size 11 (0xb)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: call instance void CodeGate.WS.Compiler.Providers.WSCodeProvider.WSCodeObject::.ctor(valuetype CodeGate.WS.Compiler.WS_TOKEN_INFO)
IL_0007: nop
IL_0008: nop
IL_0009: nop
IL_000a: ret
} // end of method WSCodeTypeReference::.ctor
Встречается целых три nop'а. Производительность JIT естественно падает, так как это лишняя инструкция для анализа (всё равно что для лексического анализатора лишний пробел - лишнее сканирование одного символа). А безусловные переходы на инструкцию, которая стоит после неё же, встречается там, где есть использование таблиц переключателей (т.е. switch) конструкция
Т.е. проход JIT'а оптимизировать смысла нет, т.к. он и так очень быстр.
Если надо оптимизмровать что либо, то точно не тут.