В C ++ есть правило «как если», которое гласит, что компилятор может делать все, что он хочет, при условии, что наблюдаемые эффекты неотличимы от того, что определено стандартом. В этом случае тривиально доказать, что оба фрагмента имеют одинаковое значение, и компилятор, скорее всего, выдаст одинаковые инструкции для обоих.
Примечание: здесь вы не занимаетесь динамическим программированием, так как не запоминаете пары параметров / результатов.
Вы можете запустить JIT-компилятор для компиляции всего набора сборок во время процедуры инициализации вашего приложения с помощью метода PrepareMethod
... (без использования NGen
).
Это решение описано более подробно здесь: Принудительная JIT-компиляция во время выполнения .
Как отметил Марк, продолжающиеся всплески не похожи на проблемы JIT. Другие вещи, которые нужно искать:
Сборка мусора - вы выделяете память во время обработки аудио? Если вы создаете много мусора или даже объекты, которые выживают в коллекции Gen 0, это может привести к заметным всплескам. Похоже, вы делаете какое-то предварительное распределение, но следите за скрытыми выделениями в коде библиотеки (даже цикл foreach может выделить!)
Денормали. Существует проблема с определенными типами процессоров при работе с очень маленькими числами с плавающей запятой, которые могут вызвать скачки ЦП. Подробности см. В http://www.musicdsp.org/files/denormal.pdf .
Редактировать:
Даже если вы не хотите использовать NGen, хотя бы сравните NGen '
Начальная скорость действительно звучит как Fusion + JIT, что поможет ILMerge (для Fusion) и NGEN (для JIT); вы всегда можете воспроизвести тихую дорожку через систему при запуске, чтобы выполнить всю тяжелую работу, не заметив искажения пользователем?
NGEN - хороший вариант; есть ли причина , которую вы не можете использовать?
Проблемы, о которых вы упоминаете после начальной загрузки, не звучат так, как будто они связаны с JIT. Возможно, сборщик мусора.
Вы пробовали профилирование? И процессор, и память (коллекции)?
Если вы считаете, что на вас влияет JIT, предварительно скомпилируйте приложение с помощью NGEN и снова запустите тесты. В коде, скомпилированном NGEN, нет накладных расходов JIT. Если вы все еще видите всплески в приложении NGEN'd, значит, вы знаете, что они не вызваны JIT.