наиболее подходящий язык для вычислительных и дорогостоящих алгоритмов - PullRequest
4 голосов
/ 11 апреля 2011

Допустим, вам нужно внедрить инструмент для эффективного решения NP-трудной проблемы с неизбежным возможным взрывом использования памяти (размер вывода в некоторых случаях экспоненциальный по отношению к размеру ввода), и вас особенно беспокоит производительность этогоинструмент во время работы.Исходный код также должен быть читаемым и понятным после того, как базовая теория станет известна, и это требование так же важно, как и эффективность самого инструмента.

Лично я считаю, что для этих трех требований могут подойти 3 языка: C ++, Scala, Java.Все они обеспечивают правильную абстракцию типов данных, которая позволяет сравнивать различные структуры или применять одни и те же алгоритмы (что также важно) к различным типам данных.

C ++ имеет то преимущество, что он статически компилируется и оптимизируется,а также с помощью встраивания функций (если структуры данных и алгоритмы разработаны тщательно) и других методов оптимизации можно достичь производительности, близкой к производительности чистого C, при сохранении довольно хорошей читабельности.Если вы также уделяете много внимания представлению данных, вы можете оптимизировать производительность кэша, которая может увеличиваться на несколько порядков при низкой частоте промахов кэша.

Вместо этого Java компилируется JIT, что позволяет применятьоптимизация во время выполнения, и в этой категории алгоритмов, которые могут иметь различное поведение между различными запусками, это может быть плюсом.Вместо этого я боюсь, что такой подход может пострадать от сборщика мусора, однако в случае этого алгоритма обычно постоянно выделяется память и производительность кучи Java, как известно, лучше, чем в C / C ++, и если вы реализуете свой собственный менеджер памяти на языке, который вы могли быдаже добиться хорошей эффективности.Этот подход вместо этого не способен встроить вызов метода (что приводит к огромному снижению производительности) и не дает вам контроля над производительностью кэша.Среди плюсов есть лучший и более чистый синтаксис, чем C ++.

Мои опасения по поводу scala более или менее такие же, как у Java, плюс тот факт, что я не могу контролировать, как оптимизируется язык, если у меня нет глубокого понимания.знание компилятора и стандартной библиотеки.Но хорошо: у меня очень чистый синтаксис:)

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

Ответы [ 4 ]

5 голосов
/ 11 апреля 2011

Обычно я бы сказал «C ++» в одно мгновение. Секрет в том, что C ++ просто производит меньше (памяти) мусора, который требует управления.

С другой стороны, ваше наблюдение, что

однако в случае этого алгоритма принято постоянно выделять память

- намек на то, что Java / Scala на самом деле может быть более подходящим. Но тогда вы могли бы также использовать небольшую кучу объектов в C ++. У Boost есть тот, который использует стандартный интерфейс allocator, если память служит.

Еще одним преимуществом C ++, очевидно, является использование абстракции без штрафа с помощью шаблонов - то есть то, что вы можете легко создавать общие алгоритмические компоненты, которые могут взаимодействовать без дополнительных затрат времени выполнения из-за абстракции. На самом деле, вы отметили, что

можно достичь производительности, близкой к производительности чистого C, при сохранении довольно хорошей читаемости

- это выглядит неправильно: Шаблоны позволяют C ++ достигать производительности превосходят по сравнению с C при сохранении высокой абстракции.

2 голосов
/ 11 апреля 2011

D, возможно, стоит посмотреть, потому что он пытается стать лучшим C ++.

1 голос
/ 20 апреля 2011

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

1 голос
/ 11 апреля 2011

Языки, которые вы заметили, были моими первыми догадками.

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

Невозможно сказать, что лучше, и, скорее всего, нет большой разницы, если вы достаточно знакомы со всеми из них, чтобы обойти их причуды.

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

Отдельное замечание о C ++ против Java: это действительно священная война, и если вы следили за недавней разработкойу вас, вероятно, будет собственное мнение.Я, например, думаю, что Java предлагает достаточно хорошие аспекты, чтобы восполнить его недостатки, обычно.

И последнее замечание по C ++ и C: насколько мне известно, разница обычно составляет достаточно низкий процент дляигнорируй это.Если для исходного кода это не имеет значения, то хорошо бы пойти с C, если C ++ может сделать более легким для чтения исходный код, используйте C ++.В любом случае, выбор незначителен.

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

Все сводится к следующему: любой из ваших вариантов подходит, если вы все делаете правильно (знание предметной области).

...