Избегание накладных расходов С# JIT

118
10

Есть ли простой способ JIT-кода С# впереди, а не ждать, когда первый раз вызывается код? Я читал про NGEN, но я не думаю, что это поможет мне.


Мое приложение ждет и отвечает на конкретное внешнее событие, которое поступает из UDP-порта, и ни один из кода критического пути не выполняется (а) до того, как произойдет событие, или (б) когда-нибудь снова запустится, поэтому стоимость В этом сценарии JIT высока. Проверка с профилировщиком ANTS накладные расходы для JIT составляет около 40-50%, иногда это достигает 90%. Мое приложение чувствительно к задержке, и каждая миллисекунда рассчитывает.


Моя первоначальная мысль заключается в том, что я могу добавить параметр bool для каждого метода критического пути и вызвать эти методы до возникновения события, чтобы инициировать компиляцию JIT. Однако есть ли более красивый и менее хакерский способ?


Большое спасибо

спросил(а) 2021-01-14T00:35:01+03:00 1 неделя назад
1
Решение
103

Я бы сказал, использую NGEN, и если это не сработает, у вас, вероятно, будут более глубокие проблемы.

Но, чтобы ответить на ваш вопрос, эта статья о том, как pre-jit использует System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod, чтобы заставить JIT. Он включает пример кода для использования отражения для получения обработок метода.

ответил(а) 2021-01-14T00:35:01+03:00 1 неделя назад
85

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


NGEN предоставит вам ответ. Мое предложение состоит в том, чтобы взять минимальный необходимый код, критический путь, если хотите, и поместить его в проект "пустышки/песочницы". Начать профилирование /NGenning этого кода и увидеть производительность.

Если этот минимальный код, даже после того, как NGEN'ed работает плохо на нескольких вызовах, то предварительная компиляция не поможет вам. Его что-то еще в коде, вызывающем шею бутылки производительности.

ответил(а) 2021-01-14T00:35:01+03:00 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема