Как protobuf-сетевой достигает значительной производительности?

Мой Путь:

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

я также следовал за мыслями Stephen Walther на MVC, и я думаю , это сообщение является большим повторно заполнить поля с данными, отправленными для него, чтобы быть измененным прежде, чем отправить его снова.

, Что делает Вас, парни используют?

35
задан Community 23 May 2017 в 10:29
поделиться

1 ответ

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

Внутри он пытается разумно использовать отражение при разговоре с членами; он использует Delegate.CreateDelegate для взаимодействия со свойствами и DynamicMethod (и настраиваемый IL) для взаимодействия с полями (когда это возможно; это зависит от целевой структуры). Это означает, что он всегда обращается к известным типам делегатов, а не только к DynamicInvoke (что очень медленно).

Не сходя с ума, в коде есть некоторые оптимизации (возможно, за счет удобства чтения) с точки зрения:

  • локального байта [] буферизации (входных / выходных потоков)
  • с использованием массивов фиксированного размера (скорее, чем списки и т. д.); возможно, слишком много
  • использования дженериков, чтобы избежать упаковки
  • многочисленных настроек / тиддлов и т. д. вокруг циклов двоичной обработки

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

I есть несколько проектов (только в моей голове) для рефакторинга этого с использованием не -общих интерфейсов, и вместо этого (для подходящих фреймворков) больше использовать ILGenerator (моим первым выбором было бы Expression , но это требует более высокой версии фреймворка). Проблема, однако, в том, что на это уйдет много времени, и до недавнего времени я был изрядно завален .

Недавно мне удалось Снова начну тратить время на protobuf-net , так что, надеюсь, я очищу накопившиеся запросы и т.д. и скоро приступлю к этому. Я также намерен заставить его работать с моделями , отличными , кроме отражения (т.е. описывая отображение проводов отдельно).


и не генерируя никакого сгенерированного кода

Я также должен уточнить, что есть два (необязательных) маршрута кодогенерации, если вы хотите использовать сгенерированный код; protogen.exe, или надстройка VS , позволяющая генерировать код из файла .proto. Но в этом нет необходимости - это полезно, в основном, если у вас есть существующий файл .proto или вы собираетесь взаимодействовать с другим языком (C ++ и т. Д.) Для разработки по контракту.

44
ответ дан 27 November 2019 в 15:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: