Как реализовать собственное создание и удаление байтового массива - PullRequest
5 голосов
/ 21 сентября 2009

ФОН:

При запуске моего приложения через профилировщик создается впечатление, что все горячие точки участвуют в выделении большого количества временных новых массивов byte [].

За один запуск в CLR Profiler несколько коротких (3-5 секунд процессорного времени вне профилировщика) генерировали более гигабайта мусора, большая часть которого была распределена в байтах [], и это вызвало более 500 сборок.

В некоторых случаях кажется, что приложение тратит более 10% своего процессорного времени на выполнение сборов.

Ясно, что перезапись в порядке.

Итак, я подумываю о замене новых распределений в байтах [] классом пула, который может использовать буфер позднее.

Как то так ...

{
 byte[] temp = Pool.AllocateBuffer(1024);
 ...
 }

ВОПРОС:

Как заставить приложение вызывать код в подпрограмме Pool.deAllocate (temp), когда temp больше не нужен.

В приведенном выше фрагменте кода, когда temp является буфером, выделенным для пула byte [], но когда он выходит из области видимости, он удаляется. Не реальная проблема, но не используется в пуле.

Я знаю, что мог бы заменить "return 0;" с "Pool.deAllocate (temp); вернуть 0", но я пытаюсь заставить восстановление произойти.

Возможно ли это хотя бы отдаленно?

1 Ответ

4 голосов
/ 21 сентября 2009

Вы можете реализовать класс Buffer, который реализует IDisposable и возвращает буфер в пул после его удаления. Затем вы можете предоставить доступ к базовому байтовому массиву и , пока все играют хорошо , вы можете воспользоваться преимуществом повторного использования.

Будьте предупреждены, хотя:

  • Ваши буферы быстро окажутся во втором поколении, что может не подойти по другим причинам
  • Если вредоносный фрагмент кода сохраняет ссылку на байтовый массив, он может следить за данными, используемыми другим кодом
  • Вы должны помнить, чтобы утилизировать буферы в нужное время.

У меня действительно есть какой-то код в MiscUtil для этого - см. CachingBufferManager, CachedBuffer и т. Д. Я не могу сказать, что я использовал это много, заметьте ... и от чего Я помню, я сделал это немного сложнее, чем мне действительно нужно ...

РЕДАКТИРОВАТЬ: Чтобы ответить на комментарии ...

  • Вы не можете заставить код приложения освобождать буферы, нет. В C # нет механизма автоматического освобождения - оператор using - самый близкий к нам.
  • Вы можете реализовать неявное преобразование в byte[] в своем классе буфера, чтобы позволить вам вызывать методы, которые имеют параметры байтового массива. Лично я не большой поклонник неявных преобразований, но это, безусловно, доступно в качестве опции.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...