C # /. NET: UnmanagedMemoryStream для работы в сети? - PullRequest
2 голосов
/ 20 октября 2010

Я рассматривал возможность использования UnmanagedMemoryStream вместо MemoryStream для обработки входящих (и, возможно, исходящих?) Пакетов на сетевом сервере. Я надеюсь добиться меньшего копирования значений и, если возможно, избежать копирования в кучу (слишком много).

Например, для входящего пакета можно сделать:

fixed (byte* p = &data) // where data comes from a socket receive
{
    using (var stream = new UnmanagedMemoryStream(p, data.Length))
    {
        // do handling here...
    }
}

Тем не менее, я не совсем уверен, есть ли в этом какая-то реальная выгода. Может ли кто-нибудь прийти с некоторой обратной связью относительно того, будет ли в этом какая-то ценность, а не использование старого доброго управляемого MemoryStream?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 20 октября 2010

Для меня это звучит как преждевременная оптимизация. Вы использовали MemoryStream и провели какое-то профилирование, чтобы показать, что оно вызвало у вас ощутимые, измеримые проблемы с производительностью?

Я бы придерживался обычного MemoryStream и избавлял себя от головной боли, пока не стало очевидно (через профилирование), что это необходимо изменить.

0 голосов
/ 20 октября 2010

Нет, вы не улучшили то, что уже есть.Байт [] является ссылочным типом.Вы можете просто передать его конструктору MemoryStream (byte []) и данные no копируются.MS просто хранит ссылку на тот же массив.

На самом деле, вы сделали все хуже, потому что закрепили массив.Заставить сборщик мусора запускаться внутри тела вашего фрагмента не маловероятно, вы читаете материал из массива и, вероятно, создаете объекты из данных, строк и чего-то еще.Сборщик мусора должен работать вокруг закрепленного массива, что значительно усложняет его работу.Это может на некоторое время повлиять на производительность вашей программы, поэтому сжатие кучи важно для повышения эффективности кэша ЦП.

...