Я пишу приложение DSP в С# (в основном, многодорожечный редактор). Я проделывал его довольно долгое время на разных машинах, и я заметил некоторые "любопытные" вещи.
На моей домашней машине первый запуск цикла воспроизведения занимает около 50% -60% доступного времени (я предполагаю, что это связано с тем, что JIT выполняет свою работу), а затем для последующих циклов он переходит на устойчивое потребление 5%. Проблема в том, что если я запускаю приложение на более медленном компьютере, первый запуск занимает больше, чем доступное время, что приводит к прерыванию воспроизведения и испорчению выходного аудиосигнала, что неприемлемо. После этого он снижается до 8% -10% потребления.
Даже после первого запуска приложение время от времени вызывает вызовы некоторых трудоемких процедур (каждые 2 секунды или более), что приводит к тому, что устойчивое потребление 5% испытывает очень короткие пики 20-25%. Я заметил, что если я позволю программе работать некоторое время, эти пики также снизятся до 7% -10%. (Я не уверен, что это связано с перекомпиляцией JIT этих частей кода).
Итак, у меня есть серьезная проблема с JIT. Хотя приложение будет вести себя хорошо даже на очень медленных машинах, эти "компиляционные штормы" будут большой проблемой. Я пытаюсь понять, как решить эту проблему, и я придумал идею, которая заключается в том, чтобы пометить все "разумные" подпрограммы атрибутом, который будет сообщать приложению "сжать" их заранее во время запуска, поэтому они будут полностью оптимизированы, когда они действительно понадобятся. Но это только идея (и мне тоже это не слишком нравится), и мне интересно, есть ли лучшее решение всей проблемы.
Я бы хотел услышать, что вы, ребята, думаете.
(NGEN приложение не является вариантом, мне нравится и хочу, чтобы все оптимизаторы JIT я мог получить.)
EDIT:
Утилизация памяти и сбор мусора не проблема, я использую пулы объектов, а максимальный пик памяти во время воспроизведения составляет 304 КБ.