Короткий ответ: он требует много настроек и может быть очень сложно, если вы не опытный разработчик D.
Список вопросов:
Управление памятью сама не такая уж большая проблема. В приложениях реального времени вы никогда не хотите выделять память в основном цикле. Наличие предварительно выделенных пулов памяти для всех основных данных в значительной степени де-факто стандартно для таких приложений. В этом смысле D не отличается - вы все равно вызываете C malloc напрямую, чтобы получить кучу для ваших пулов, и эта память не будет управляться GC, она даже не узнает об этом.
Однако некоторые функции и большие части Phobos действительно используют GC automagically. Например, вы не можете объединить фрагменты без какой-либо формы автоматического управления. И у Фобоса просто не было сильной политики об этом в течение довольно долгого времени.
Немногие расцепители, инициируемые языками, сами по себе не будут проблемой, так как большая часть используемой памяти управляется через пулы в любом случае. Тем не менее, есть проблема с убийцей для программного обеспечения реального времени в запасе D: по умолчанию D сборщик мусора - это стоп-мир. Даже если почти нет мусора, вся ваша программа попадет в шип задержки, когда цикл сбора будет запущен, так как все потоки блокируются.
Что можно сделать:
1) Используйте GC.disable();
для отключения циклов сбора.Это решит проблему «стоп-мир», но теперь ваша программа начнет утечку памяти в некоторых случаях, так как распределение на основе GC по-прежнему работает.
2) Дамп скрытых ассигнований ГХ. Был запрос на изгиб для переключателя -vgc
, который я не могу найти прямо сейчас, но в его отсутствие вы можете скомпилировать свою собственную версию druntime, которая печатает обратную трассировку по вызову gc_malloc()
. Вы можете запустить это как часть автоматического набора тестов.
3) Избегайте Phobos полностью и используйте что-то вроде https://bitbucket.org/timosi/minlibd в качестве альтернативы.
Выполнение всего этого должно быть достаточным для удовлетворения требований обычного режима реального времени, характерных для игры dev, но, как вы можете видеть, это не просто и требует выхода из состава D распределения.
Будущее альтернатива:
После того, как порты Leandro Lucarella его concurrent garbage collector к D2 (который планируется, но не планируется), ситуация станет гораздо проще. Небольшое количество управляемой GC-совместимой памяти + параллельная реализация позволит удовлетворять требованиям в режиме реального времени даже без отключения GC. Даже Phobos можно использовать после того, как он лишен самых раздражающих распределений. Но я не думаю, что это произойдет в ближайшее время.
Но как насчет жесткого режима реального времени?
Лучше даже не попробовать. Но это еще одна история.
Видимо есть теперь одновременно GC, что резко снижает паузами и используется для систем, требующих «низкую латентность»: http://www.reddit.com/r/programming/comments/1eovfu/dconf_2013_day_1_talk_6_concurrent_garbage/ – delnan
Это исследовательский проект с использованием D1; это действительно не помогает. Хотя, некоторые из обсуждений актуальны. –
Совет, так как вы учитесь: сосредоточьтесь на том, чтобы все было сделано сначала, и только тогда на его скорости - первое достаточно сложно в одиночку! (imho, используя D имеет смысл в любом случае) – vines