2013-05-21 5 views
4

Я рассматриваю возможность использования d для моего текущего графического движка. Единственное, что меня заводит, - это GC.Использование D для приложения в реальном времени?

Я все еще молодой программист, и у меня, вероятно, есть много неправильных представлений о GC, и я надеюсь, что вы можете прояснить некоторые проблемы.

Я стремлюсь к низкой задержке и времени в целом, имеет решающее значение. Из того, что я знаю, это то, что GC довольно непредсказуемы, например, мое приложение может отображать кадр каждые 16,6 мс, а когда удары GC в него могут подняться до любого числа, такого как 30 мс, потому что оно не является детерминированным?

Я прочитал, что вы можете отключить GC в D, но тогда вы не можете использовать большую часть стандартной библиотеки D, а GC не полностью выключен. Это правда?

Считаете ли вы целесообразным использовать D в срочном приложении?

+2

Видимо есть теперь одновременно GC, что резко снижает паузами и используется для систем, требующих «низкую латентность»: http://www.reddit.com/r/programming/comments/1eovfu/dconf_2013_day_1_talk_6_concurrent_garbage/ – delnan

+1

Это исследовательский проект с использованием D1; это действительно не помогает. Хотя, некоторые из обсуждений актуальны. –

+0

Совет, так как вы учитесь: сосредоточьтесь на том, чтобы все было сделано сначала, и только тогда на его скорости - первое достаточно сложно в одиночку! (imho, используя D имеет смысл в любом случае) – vines

ответ

8

Короткий ответ: он требует много настроек и может быть очень сложно, если вы не опытный разработчик 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 можно использовать после того, как он лишен самых раздражающих распределений. Но я не думаю, что это произойдет в ближайшее время.

Но как насчет жесткого режима реального времени?

Лучше даже не попробовать. Но это еще одна история.

2

Если вам не нравится GC - отключите его.

Вот как:

import core.memory; 

void main(string[] args) { 
    GC.disable; 
    // your code here 
} 

Естественно, то вам придется сделать память управлять самостоятельно. Это выполнимо, и есть несколько статей об этом. Здесь также обсуждается, я просто не помню нить.

dlang.org также имеет полезную информацию об этом. Эта статья, http://dlang.org/memory.html, затрагивает тему программирования в реальном времени, и вы должны ее прочитать.

Еще один хороший товар: http://3d.benjamin-thaut.de/?p=20.

+0

Из того, что я знаю, GC все равно будет работать, даже если он отключен. Можете ли вы подтвердить или опровергнуть это? Также верно ли, что я не могу использовать 90% библиотеки std, если я отключил GC? –

+0

Он не будет работать в некотором смысле, что циклы сбора данных никогда не будут выполняться, но он все равно будет существовать и выделять память по запросу. По этой причине вы сможете использовать std-библиотеку с отключенным GC, но она будет протекать как ад. –