Советы по реализации низкоуровневых библиотек на D (в отличие от C/C++)

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

Мне нужно предоставить C API для библиотеки для совместимости с другими языками, такими как C++ и Python, и я также ожидаю, что некоторые разделы, возможно, потребуется написать на простом C для настройки производительности.

D кажется очень привлекательным для этой работы: есть ли какие-то подводные камни, о которых я должен знать при рассмотрении этих требований? Как производительность D-контейнеров сравнивается с std::(map, vector, unordered_map и т. д.), принимая во внимание ручную настройку производительности (например, использование std::map::lower_bound для поиска/вставки и т. д.). ).


person Rehno Lindeque    schedule 28.11.2009    source источник
comment
Вы никогда не узнаете, не сравнив эти вещи для себя. Как вы собираетесь писать низкоуровневую библиотеку, не понимая ее производительности?   -  person Jonathan Feinberg    schedule 28.11.2009
comment
@Jonathan: я все еще на стадии спекулятивного дизайна. Я ищу быстрые ответы о жизнеспособности, прежде чем копаться в тестах. Я не думаю, что будет пустой тратой времени сначала выслушать, что другие скажут об этом. (Но настроить некоторые тесты — хорошая идея)   -  person Rehno Lindeque    schedule 28.11.2009
comment
В любом случае вам могут понадобиться некоторые агрессивные методы настройки производительности, такие как: стратегии оптимизации последней инстанции"> stackoverflow.com/questions/926266/   -  person Mike Dunlavey    schedule 28.11.2009


Ответы (2)


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

Если вы заинтересованы в краткосрочной перспективе, я бы рекомендовал не использовать D. Это все еще слишком передовой вариант.

Однако в долгосрочной перспективе D начинает стабилизироваться. Версия 2 языка, скорее всего, будет стабильной через 6 месяцев. Андрей Александреску выпускает книгу под названием «Язык программирования D» в марте, и предпринимаются огромные усилия, чтобы стабилизировать для него D2.

Что касается ловушек, я бы сказал, что самая большая из них заключается в том, что идиоматический способ D делать большинство вещей — это использовать множество шаблонов, что затрудняет создание стабильных ABI для вещей. Это можно сделать, просто это не идиоматично. Во-вторых, пока нет хорошей контейнерной библиотеки для версии 2 языка, хотя, по-видимому, над этим работают.

Что касается производительности, DMD, эталонная реализация, имеет старый оптимизатор. Если вы действительно одержимы производительностью, это может быть проблемой. GDC, компилятор D для GCC, имеет лучший оптимизатор, но всегда отстает на несколько релизов. LDC, компилятор D для LLVM, имеет потрясающий оптимизатор, но поддерживает только версию 1 языка. Однако предполагается, что D должен быть таким же быстрым, как C++, а D, скомпилированный с помощью DMD, действительно такой же быстрый, как C++, скомпилированный с помощью компилятора C++ Digital Mars, в соответствии с моими тестами.

person dsimcha    schedule 29.11.2009
comment
Честно говоря, эта библиотека представляет собой нечто вроде огромного ассоциативного контейнера, более или менее похожего на живую базу данных. На самом деле мне не нужна высокая производительность для моих первоначальных приложений, но я намерен превратить библиотеку в надежное приложение с высокой пропускной способностью, поэтому я хочу, так сказать, относительно простой путь обновления. Мой план состоял в том, чтобы начать с некоторых контейнеров STL и постепенно перейти к специальным структурам, которые обрабатывают такие вещи, как подкачка на диск и оптимизация использования кеша во время выполнения (очевидно, это очень долгосрочная перспектива). Я, вероятно, мог бы написать код на C и связать его с D lib... - person Rehno Lindeque; 29.11.2009
comment
(Кроме того, я большой поклонник LLVM, поэтому я надеюсь, что LDC будет поддерживать 2.0 в ближайшем будущем. Если бы у меня было столько времени, я бы вскочил и помог!) - person Rehno Lindeque; 29.11.2009

В дополнение к ответу dsimcha я хотел бы отметить, что для написания приложений с хорошей производительностью в D требуется, в первую очередь, хорошая игра с GC. Сборка мусора в D происходит не так быстро, как в Java или C#, поэтому нужно знать, когда и как этого избежать или свести к минимуму. К счастью, вы можете 1) гораздо лучше использовать выделение стека с помощью raii и 2) при необходимости использовать ручное управление памятью.

Вот (несколько старая) презентация о том, как Tango воспользовалась преимуществами D-массивов и нарезки для высокопроизводительной библиотеки Array slicing для shizzle: http://video.google.com/videoplay?docid=-4010965350602541568&hl=en#

погуглите "конференция 2007" для слайдов. (Я здесь новенький и могу разместить только одну ссылку, извините)

person Lutger    schedule 14.12.2009
comment
Ах да, я намерен использовать ручное управление памятью. Спасибо, информация о слайсах очень информативна! - person Rehno Lindeque; 16.12.2009