Прежде всего ваш метод сериализации содержит ошибку:
Обратите внимание, что буфер содержит выделенные байты, которые могут быть не использованы. Например, если строка «test» записана в объект MemoryStream, длина буфера, возвращаемого из GetBuffer, составляет 256, а не 4, при этом 252 байта не используются. Чтобы получить только данные в буфере, используйте метод ToArray; однако ToArray создает копию данных в памяти.
т.е. возвращаемые массивы больше, чем сериализованные данные
Для десериализации вы можете создать поток памяти, который использует переданный массив, поэтому он не будет выделять внутренние буферы. Но если у вас нет тестов, которые показывают, что распределение потока памяти является узким местом, я бы не стал беспокоиться.
Если вы действительно хотите оптимизировать распределение памяти, вам необходимо повторно использовать буферы byte[]
. Это, в частности, означает изменение API для работы с подразделами массивов, чтобы размер сообщения и размер массива не обязательно были одинаковыми.
Ниже приведены подробности реализации, которые могут измениться в любое время (и, возможно, уже изменились с тех пор, как я об этом прочитал):
Конечно, не стоит беспокоиться, если буферы не окажутся в куче больших объектов. Если объекты маленькие, они будут дешево собраны в следующей коллекции Gen0. С другой стороны, куча больших объектов напрямую попадает в Gen2. Здесь размещены объекты AFAIR> 250 КБ.
И, конечно, повторное использование буферов без их сжатия может привести к утечке памяти.