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

Почему поведение Elixir Access не является протоколом?

В последних версиях Elixir Access уже реализован не как протокол, а как поведение. Насколько я понимаю, это изменение было мотивировано соображениями производительности в режиме разработки.

Теперь, глядя на реализацию, мне интересно, как это работает внутри и почему эта реализация была выбрана. Как мы можем видеть здесь, Access отправляет в модуль struct через ключ "__struct__" соответствующей карты. AFAICS, это примерно работает как полиморфизм в стиле ООП. Несколько вопросов по этому поводу:

  1. Почему это быстрее?
  2. Каковы недостатки по сравнению с протоколами? Из того, что я могу сказать, это менее расширяемый. Есть ли другие?
  3. До сих пор я видел только поведение в контексте таких вещей, как GenServer, где модуль обратного вызова захватывается при инициализации и сохраняется в процессе (по крайней мере, я так полагаю). Здесь поведение Access захватывает модуль обратного вызова из данных. Было бы возможно даже реализовать это поведение для чего-то, что не является структурой?
  4. Является ли такого рода рассылка распространенной передовой практикой в эрланге или эликсире, когда никто не заинтересован в дополнительном преимуществе, которое даст протокол?
4b9b3361

Ответ 1

Как вы уже упоминали, реализация Access была изменена, чтобы использовать Поведения вместо протоколов. Аргументация была производительность.

  • Протоколы являются полиморфизмом типа/данных и являются эксклюзивными для Elixir. Это означает, что позволяет отправлять на основе структуры данных
  • Поведения - это механизм без типов, который полагается не на структуру данных, а на модуль в качестве аргумента. Они также встроены прямо в экосистему Erlang/OTP и намного более производительны.

Несмотря на то, что протоколы выполняют большую работу для вас при распределении данных по типам данных, они все равно никогда не будут достаточно быстрыми для Access из-за способа их реализации (консолидация),

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

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

Это происходит потому, что протокол Access вызывается тысячи раз, и мы мало что можем сделать, чтобы улучшить его (в отличие от протокола Enumerable, где большинство случаев списка встроено).

Хосе Валим


Дальнейшее чтение: