Модули OCaml и производительность - PullRequest
7 голосов
/ 11 ноября 2009

Некоторые функции действительно легко реализовать в OCaml (например, карта из списка), но вы можете использовать карту библиотеки OCaml: List.map

Однако мы можем задаться вопросом, какой код будет более эффективным. Вызов модуля отдельного модуля компиляции (библиотеки) может привести к потере некоторых возможных оптимизаций. В группе новостей fa.caml я прочитал, что при вызове функций из библиотек используются замыкания.

У меня есть код OCaml, который использует модули и функторы для общего программирования. По исторической причине мой код монолитен: все в одном файле. Теперь у меня больше времени, я готов разделить код на файлы для таких модулей. Тем не менее, я боюсь, что могу потерять производительность, потому что мне потребовалось некоторое время, чтобы понять это правильно. Например, у меня есть модули для упаковки сложных объектов с числами, поэтому я применяю уникальное представление и быстрое сравнение. Я использую эти обернутые объекты с общими картами, наборами и строю кеш на них.

Вопросы:

  • Собираюсь ли я потерять производительность, если перейду к отдельным файлам?
  • Проводит ли OCaml много оптимизаций в моем коде, полном модулей, функторов и т. Д.?

В C ++, если вы определяете метод класса в .h, компилятор может в конечном итоге включить короткие методы и т. Д. Возможно ли добиться этого в OCaml, используя отдельные файлы?

1 Ответ

9 голосов
/ 12 ноября 2009

Вы можете потерять часть производительности. Однако есть два смягчающих фактора:

  • Компилятор собственного кода OCaml может выполнять межмодульное встраивание, поэтому код может быть встроен даже между отдельными блоками компиляции (с парой предостережений - рекурсивные функции и аргументы функций не встроены между модулями [ 1] ).
  • Код, скорее всего, все еще будет достаточно быстрым, а выигрыш в удобочитаемости и удобстве обслуживания, возможно, перевесит любые (предельные) затраты на производительность.

Я не знаю, если OCaml деукторирует код, в котором функторы определены в одном и том же исходном файле. Если это не так, то модули не должны добавлять какой-либо удар по производительности выше того, который уже был нанесен функторами.

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

...