2015-07-31 2 views
4

Большинство книг или онлайн-ресурсов, которые я видел, все используют записи для хранения состояния процесса (вероятно, потому, что это был путь для большего (?), Чем десятилетия). С другой стороны, карты эффективно используются для замены кортежей в stdlib (например, childspecs in the supervisor module).Есть ли преимущества в использовании карт вместо записей для хранения состояний в процессах Erlang?

В качестве примера, я работаю свой путь через Learn You Some Erlang's Finite State Machines главы и state записи может быть заменена на карте, объявленной в init/1 обратного вызова необходимой gen_fsm.

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

Кроме того, было бы более эффективным?
Я знаю, что хорошо продуманный бенчмарк ответит на мой вопрос, но я всего пару недель изучаю Эрланг, а mapsmodule довольно новый и еще changing.

UPDATE: Благодаря I Give Ужасные КОНСУЛЬТАЦИИ, я прочитал LYSE chapter on maps более тщательно и ответ ясен:

Использование записей имеет то преимущество, что ключи известны во время компиляции времени, что приносит преимущества

  • быстрый доступ к определенным значениям (быстрее, чем это возможно динамически)
  • дополнительной безопасности (аварии в начале, а не развращать состояние)
  • проще типа проверкой

Они делают записи абсолютно подходят для процесса внутреннего состояния, несмотря на случайном бремя написания более подробную функции code_change.

С другой стороны, когда пользователи Erlang будут использовать записи для представления сложных структур данных вложенного ключа/значения (как ни странно, подобных объекты в объектно-ориентированных языках), которые часто пересекает модуль границы, карта поможет много , Записи были неправильным инструментом для этой работы .

+1

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

ответ

3

Я добавил главу в Learn You Некоторых Erlang сайта о картах в частности: http://learnyousomeerlang.com/maps

раздел Мексиканского Standoff специально сравнивает карты с записями и dicts. Семантически говоря, карты больше похожи на dicts, чем на записи, и моя рекомендация действительно заключалась бы в использовании записей, где записи имели смысл (ограниченный набор ключей с известными типами с доступом O (1)) и карты, в которых вы использовали бы dicts (гетерогенные, гибкие наборы пар ключ/значение).

+0

Спасибо, я просто просмотрел эту главу раньше, но ответ явно там. Я еще не читал кадровое предложение Ричарда О'Кифа, но все источники говорят, что он превосходный, даже если он не будет включен (пока?) В Erlang/OTP. –

0

Как Джо Армстронг said:

Запись мертва - длинные живые карта!

и

Мы говорили о картах на протяжении двенадцати лет, но теперь они здесь, чтобы остаться.

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

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

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

+0

Что вы используете в своем проекте, если я могу спросить? –

+2

Карты по-прежнему являются своего рода конкретным прецедентом в моем коде. Для большинства вещей * семантика * записи/кортежа является подходящей - поскольку данные имеют определенную форму, а * форма не является динамической *. Это форма сильного аргумента ввода. Возможность проверить правильность формы данных может помочь вам раннее, а не слепо вспахать некоторые плохие данные в виде карты на некоторое время, возможно, создавая разрушительные обновления для какого-либо внешнего ресурса в процессе, прежде чем осознать, что это wasn Это карта, на которую вы так думали (упс!). – zxq9

+1

Мы используем карты как состояния в процессах gen_server и в некоторых местах как источник/результат декодирования/кодирования json – justnoxx

Смежные вопросы