Можно ли с помощью protobuf-net десериализовать сообщение без выделения памяти? - PullRequest
6 голосов
/ 16 января 2012

У меня есть приложение на C #, которое должно десериализовать многие тысячи протобуф-сообщений в секунду. Чтобы избежать ненужных сборок мусора, мне интересно, есть ли способ использовать предварительно выделенную память, чтобы при каждой операции десериализации не требовалось выделять новую память.

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

Существует ли эта функция или есть какой-то другой способ оптимизации использования памяти в этом сценарии?

Спасибо!

1 Ответ

10 голосов
/ 16 января 2012

Да, есть!Внутренне, он уже использует микро-пул, чтобы избежать выделения слишком большого количества рабочих буферов, но если вы проводите через достаточное количество объектов, что проблема GC, вы можете использовать собственную схему распределения и создать собственную фабрику объектов;это не может быть указано в атрибутах в настоящее время, но может быть применено через модель типа:

RuntimeTypeModel.Default.Add(typeof (Foo), true).SetFactory(factory);

, где factory является либо:

  • имя метода static для Foo (то есть "CreateFoo"), который возвращает Foo
  • MethodInfo любого static метода (не требуетсячтобы быть на Foo), который возвращает Foo

в любом случае, метод может использовать те же сигнатуры, что и обратные вызовы - так что он может быть без параметров или может принимать контекстную информацию.Например:

public static Foo CreateFoo() {
    return GetFromYourOwnMicroPool();
}

Обратите внимание, что при таком использовании ожидается, что factory вернет объект в состояние ванили;Protobuf-Net не будет пытаться сделать это.Также обратите внимание, что в настоящее время protobuf-net не представляет свой микропул как повторно используемый компонент, но вы можете достаточно легко повторно использовать источник.

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

Дополнительно: за исключением корневого объекта ,protobuf-net поддерживает значения struct без бокса;так что если у вас сложная / вложенная объектная модель, другой вариант в крайних случаях - посмотреть struct s.

...