Почему мы должны вызывать метод TrimToSize очереди? - PullRequest
3 голосов
/ 19 октября 2011

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

Это записано в Документ очереди MSDN

Теперь вопрос в том, что в очереди, если мы добавим около 20тысячи элементов, затем по очереди эта очередь удаляется из очереди, пока очередь не станет пустой.Если мы не вызовем функцию TrimToSize, то размер очереди останется до этих 20 тысяч, но данные будут удалены сборщиком мусора, поэтому технически утечки памяти нет, и если мы проверим счет или сериализовать очередь, размер будет пустымочередь. Так почему мы должны вызывать функцию TrimToSize?

Ответы [ 5 ]

3 голосов
/ 19 октября 2011

Вы путаете ГХ объектов в очереди с «слотами» памяти для самой очереди.

В очереди будет выделено место для хранения всех ссылок 20 КБ .... эти слотыбудет просто пустым и поэтому не будет указывать на объекты, которые занимают еще больше памяти.Но эти «слоты» все еще будут там, ожидая, когда им будут назначены ссылки.

1 голос
/ 19 октября 2011

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

Предполагается, что начальная емкость равна 16Таким образом, массив длиной 16 выделяется в памяти.Теперь ваш массив увеличен до 20000, вероятно, из-за скачка в алгоритме и после того, как все задания обработаны и очередь содержит только 1 элемент.На этот раз вы используете массив длиной 20000.В этом случае ваша очередь занимает слишком много памяти, чем необходимо.

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

Глядя на этот сценарий, я предпочитаю использовать связанные списки.

1 голос
/ 19 октября 2011

Думайте в терминах двух наборов объектов:

queue       other things
+------+
| slot | -> item
| slot | -> item
| slot | -> item
:      :
| slot | -> item
+------+

Хотя сами элементы могут собираться мусором, когда они больше не используются, это не влияет на объект single , очередь, которая все еще используется.

Однако в какой-то момент, когда ваша нагрузка была высокой, она могла быть расширена до слота gazillion, и он будет сохранять этот размер, пока не будет сказано иначе.

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

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

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

Классическим примером этого является чтение элементов конфигурации из файла. После того, как вы их прочитаете, маловероятно, что они снова увеличатся в размере (пока вы не перечитаете файл, что обычно случается редко).

Если ваша очередь может часто менять размер, вверх и вниз повсюду, вам может быть лучше не , используя TrimToSize.

0 голосов
/ 19 октября 2011

В очереди используйте object [] для удержания элементов, поэтому даже если вы удалите все элементы из очереди, у вас будет в памяти массив длиной 20000

0 голосов
/ 19 октября 2011

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

Обычно вам не нужно вызывать этот метод. Но могут возникнуть ситуации, когда вы хотите выполнить маршализацию или сериализацию.

Это также очень верно, что Эндрю говорит.

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