Принуждение JIT-компилятора.NET генерировать большую часть оптимизированного кода во время запуска приложения

В C ++ есть правило «как если», которое гласит, что компилятор может делать все, что он хочет, при условии, что наблюдаемые эффекты неотличимы от того, что определено стандартом. В этом случае тривиально доказать, что оба фрагмента имеют одинаковое значение, и компилятор, скорее всего, выдаст одинаковые инструкции для обоих.

Примечание: здесь вы не занимаетесь динамическим программированием, так как не запоминаете пары параметров / результатов.

14
задан Trap 15 April 2009 в 23:07
поделиться

4 ответа

Вы можете запустить JIT-компилятор для компиляции всего набора сборок во время процедуры инициализации вашего приложения с помощью метода PrepareMethod ... (без использования NGen ).

Это решение описано более подробно здесь: Принудительная JIT-компиляция во время выполнения .

17
ответ дан 1 December 2019 в 10:19
поделиться

Как отметил Марк, продолжающиеся всплески не похожи на проблемы JIT. Другие вещи, которые нужно искать:

  • Сборка мусора - вы выделяете память во время обработки аудио? Если вы создаете много мусора или даже объекты, которые выживают в коллекции Gen 0, это может привести к заметным всплескам. Похоже, вы делаете какое-то предварительное распределение, но следите за скрытыми выделениями в коде библиотеки (даже цикл foreach может выделить!)

  • Денормали. Существует проблема с определенными типами процессоров при работе с очень маленькими числами с плавающей запятой, которые могут вызвать скачки ЦП. Подробности см. В http://www.musicdsp.org/files/denormal.pdf .

Редактировать:

Даже если вы не хотите использовать NGen, хотя бы сравните NGen '

3
ответ дан 1 December 2019 в 10:19
поделиться

Начальная скорость действительно звучит как Fusion + JIT, что поможет ILMerge (для Fusion) и NGEN (для JIT); вы всегда можете воспроизвести тихую дорожку через систему при запуске, чтобы выполнить всю тяжелую работу, не заметив искажения пользователем?

NGEN - хороший вариант; есть ли причина , которую вы не можете использовать?

Проблемы, о которых вы упоминаете после начальной загрузки, не звучат так, как будто они связаны с JIT. Возможно, сборщик мусора.

Вы пробовали профилирование? И процессор, и память (коллекции)?

4
ответ дан 1 December 2019 в 10:19
поделиться

Если вы считаете, что на вас влияет JIT, предварительно скомпилируйте приложение с помощью NGEN и снова запустите тесты. В коде, скомпилированном NGEN, нет накладных расходов JIT. Если вы все еще видите всплески в приложении NGEN'd, значит, вы знаете, что они не вызваны JIT.

2
ответ дан 1 December 2019 в 10:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: