Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Непонятный Il-код

273
28 января 2006 года
3A3-968M
1.2K / / 22.12.2005
Вопрос, который меня давно мучает: зачем компилятор языка C# (csc.exe) из версии .NET Framework 2.x компилирует nop'ы (no operator - т.е. пустые инструкции), причём в некоторых случаях в IL-коде встречается по 6 (и более) подряд идущих nop'ов. Убираю их при помощи дизассемблера ildasm и компилю заново и программа работает также. Эти непонятные nop'ы тока снижают производительность. Ещё встречается такая ситуация, когда инструкция безусловного перехода выполняет прыжок на следующую инструкцию (зачем??).
8.2K
01 февраля 2006 года
Track
44 / / 30.05.2005
Цитата:
Originally posted by 3A3-968M
Вопрос, который меня давно мучает: зачем компилятор языка C# (csc.exe) из версии .NET Framework 2.x компилирует nop'ы (no operator - т.е. пустые инструкции), причём в некоторых случаях в IL-коде встречается по 6 (и более) подряд идущих nop'ов. Убираю их при помощи дизассемблера ildasm и компилю заново и программа работает также. Эти непонятные nop'ы тока снижают производительность. Ещё встречается такая ситуация, когда инструкция безусловного перехода выполняет прыжок на следующую инструкцию (зачем??).



Судя по всему, какая-то недоработка. С другой стороны мне кажется, что при проходе над IL-кодом JIT'ом, nop'ы должны пропадать и влияния на производительность быть не должно, т.е. байт код на выходе будет в любом случае без лишних nop'ов. Это как пробелы и табуляции для csc. Таким образом, немного падает производительность JIT'а, а может и вообще не падает. Хотя это все, конечно мои предположения.

Как бы то ни было, у нас тут есть человек, который вроде очень хороший спец и он проводит у нас что-то вроде курсов для сертификации. У него и спрошу, но это будет не раньше следующей недели.

Буду рад, если ты приаттачишь пример cs-файла, который на выходе дает много nop'ов. А то лень самому придумывать код, где оно вылезет, или рыться по уже готовому.

273
01 февраля 2006 года
3A3-968M
1.2K / / 22.12.2005
Я бы с удовольствием приаттачил, но это большой проект в несколько тысяч строк. Приведу небольшой фрагмент IL-кода:
.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) конструкция
8.2K
06 февраля 2006 года
Track
44 / / 30.05.2005
В общем, судя по всему, NOP'ы не влияют на производительность. После прохода JIT'ом они пропадают. Можно поиграться, пописав код на MSIL'е, куда их понапихивать в немеряном количестве, во всякие, например циклы и пр. и тогда станет видно, что никакой ощутимой разницы все-таки нет.

Т.е. проход JIT'а оптимизировать смысла нет, т.к. он и так очень быстр.

Если надо оптимизмровать что либо, то точно не тут.
273
06 февраля 2006 года
3A3-968M
1.2K / / 22.12.2005
Ну а как быть с бессмысленной инструкцией безусловного перехода?? Ведь в результате в конечном исполняемом файле NOP'ов получается несколько сотен и этих переходов, конечно производительность от этого сильно не ухудшится, но если это приложение портируем (путём применения .NET Compact Framework) на Windows CE.NET, то на КПК ухудшение уже более заметна, но не для пользователя (временная задержка на 10 мс)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог