Подтвердить что ты не робот

Что действительно более результативно? Haskell или OCaml

Я провел последние 18 месяцев, получив контроль над функциональным программированием, начиная с изучения OCaml и уже несколько недель Haskell. Теперь я хочу сделать следующий шаг и реализовать какое-то реальное приложение: простой редактор ландшафта в реальном времени. Я написал многочисленные механизмы рендеринга в реальном времени, поэтому это знакомая тема. И используемые рекурсивные алгоритмы и структуры данных кажутся очень подходящими для функциональной реализации.

Если это приложение в реальном времени, я, естественно, ищу лучшую производительность, которую я могу получить. Теперь некоторые (IMHO весьма раздражающие) сторонники OCaml довольно часто суют против Haskell медленным по сравнению с OCaml или F #. Но в соответствии с Компьютерная игра Benchmarks Game Haskell часто бьет OCaml, если только довольно небольшими фракциями - остается проблема, что этот тест принимает только очень конкретные образцы.

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

Но, может быть, другие люди делали сопоставимые приложения в OCaml и Haskell и приводили некоторые цифры?

4b9b3361

Ответ 1

По общему мнению, как OCaml, так и Haskell имеют достаточно эффективные компиляторы и время выполнения для почти чего угодно. Выбор между ними на основе чистого исполнения кажется мне глупым. Вы зашли так далеко - отошли от явно самых низкоуровневых и передовых языков (C, С++ и т.д.) Во имя более четкого, более сжатого, более выразительного кода более высокого уровня. Итак, почему, когда различия в производительности значительно меньше, переходите к этим критериям сейчас?

Я бы пошел с более широкими критериями - если вы хотите распространять parallelism, то Haskell лучший выбор. Если вы хотите действительно повсеместную мутацию, тогда OCaml лучше.

Если вам нужно только очень грубое parallelism в лучшем случае, и вы намерены придерживаться в основном функциональных структур, а затем выберите на основе чего-то другого, например синтаксиса (я думаю, что Haskell здесь гораздо приятнее, но это субъективное) или доступных библиотек (Haskell выигрывает по количеству/доступности, но OCaml может отказаться от этого в отделе графики, тем не менее).

Я не думаю, что вы ошибетесь в любом случае

Ответ 2

С помощью двух очень умных коллег я написал библиотеку оптимизации потока в Objective Caml и Haskell. Версия Haskell немного более полиморфна, имеет больше времени проверки типа компиляции и, следовательно, имеет меньшую проверку времени выполнения. Версия OCaml использует изменчивое состояние для накопления фактов потока данных, которые могут быть быстрее или медленнее на этой неделе, в зависимости от фазы луны. Ключевым фактом является то, что в их предполагаемых приложениях, обе библиотеки настолько быстры, что их не стоит дурить с помощью. То есть в соответствующих компиляторах (Quick C-- и GHC), поэтому в оптимизации потока данных мало времени, поэтому код не стоит улучшать.

Бенчмаркинг - это ад.

Ответ 3

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

Достаточно знакомы, чтобы узнать, где будет потрачено больше всего времени?

Если это так, возможно, вы можете написать код только для этой части на разных языках и сравнить.

Но в соответствии с компьютерными играми Benchmarks Game Haskell часто бьет OCaml, хотя бы на довольно мелкие фракции - остается проблема, что этот тест принимает только очень конкретные образцы.

В тестовой игре представлены 4 набора результатов - одно ядро ​​и четырехъядерный ядро ​​, 32 или 64 бит Ubuntu - и вы можете обнаружить, что Тесты OCaml или Haskell работают лучше или хуже в зависимости от платформы.

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

Ответ 4

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

Ответ 5

Интересный вопрос. Этот рендеринг ландшафта всей планеты был одной из последних программ, которые я написал на С++, прежде чем перешел на OCaml. Оглядываясь назад, эту программу было бы намного проще писать в OCaml, чем на С++. Haskell должен сделать это сравнительно легко, но программы, как правило, намного сложнее оптимизировать в Haskell. Теоретически, Haskell имеет лучшую поддержку многоядерных процессоров, но на практике даже эксперты редко получают приличные результаты, используя Haskell для параллельного программирования.

Кроме того, для приложений реального времени вам также понадобятся низкие времена паузы от сборщика мусора. OCaml имеет приятный инкрементный сборщик, который приводит к нескольким паузам выше 30 мс, но у IIRC, GHC есть стоп-коллекционер, который несет произвольно длинные паузы.

Я предполагаю, что вы используете Linux или F #, будет гораздо лучшим выбором, чем OCaml или Haskell.

EDIT: Если вы хотите изучить перестрелку, убедитесь, что вы прочитали исходный код. Вы также можете найти страницы Wiki в Haskell об этом.