Да, есть!Внутренне, он уже использует микро-пул, чтобы избежать выделения слишком большого количества рабочих буферов, но если вы проводите через достаточное количество объектов, что проблема 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.