Оберните Byte [] в классе, чтобы уменьшить накладные расходы памяти - PullRequest
0 голосов
/ 15 февраля 2010

В моем приложении передано большое количество данных в виде объектов byte []. Который также мучает проблемы с памятью во многих случаях. Как насчет того, чтобы я обернул byte [] в классе, подобном

[Serializable] публичный класс MyClass { public byte [] Data {get; задавать; } }

Вы, ребята, думаете, я получу любую производительность, потому что теперь ссылочный тип будет передаваться скорее по типу значения, поэтому данные не нужно копировать каждый раз.

Жду ваших ответов

Ответы [ 4 ]

13 голосов
/ 15 февраля 2010

Почему это должно сделать улучшение? Это может только усугубить ситуацию. byte[] - это сам ссылочный тип, а не тип значения. Результатом будет один ненужный уровень косвенности и выделения кучи для класса.

1 голос
/ 15 февраля 2010

Вы пробовали инструмент профилирования памяти, чтобы узнать, где утечка памяти?

Я думаю, вы могли бы легче определить свои проблемы, если бы вы использовали инструмент, подобный dotTrace , для создания реального профиля памяти, а затем нашли, какие части вашей программы занимают память.

Это единственный раз, когда вы можете найти реальные решения ваших проблем с памятью.

0 голосов
/ 15 февраля 2010

Как уже указал Мехрад Афшари, байт [] уже является ссылочным типом.

Вопросы:

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

0 голосов
/ 15 февраля 2010

Это не имеет значения, поскольку байтовый массив все еще там.

Но, если вы готовы пожертвовать производительностью ради памяти, я бы посоветовал вам действительно обернуть свой байтовый массив в объект, но оставить сам массив на диске и читать его только тогда, когда это необходимо. Т.е. объект proxy .

Конечно, это зависит от вашего приложения и от того, как вы используете байты. Например, вам может даже не понадобиться загружать весь массив, если клиенту нужны только его части.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...