Каков наилучший способ определить начальную емкость для объектов коллекции? - PullRequest
0 голосов
/ 17 марта 2009

При использовании объектов, которые имеют емкость, какие рекомендации вы можете использовать, чтобы обеспечить максимальную эффективность при использовании в коллекциях? Также кажется, что .NET Framework установил некоторые из этих возможностей на низком уровне. Например, я думаю, что StringBuilder имеет начальную емкость 16. Означает ли это, что после вставки 16 строк в StringBuilder объект StringBuilder перераспределяется и удваивается в размере?

Ответы [ 4 ]

4 голосов
/ 17 марта 2009

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

2 голосов
/ 17 марта 2009

Есть только два обстоятельства, когда я когда-либо явно устанавливал емкость коллекции

  1. Я знаю точное количество элементов, которые появятся в коллекции, и я использую массив или список .
  2. Я PInvoking в функцию, которая пишет в char [], и я использую StringBuilder для взаимодействия с параметром. В этом случае вы должны установить способность для CLR маршалировать к собственному коду.

Интересно, что для # 1 это почти всегда делается, когда я копирую данные, возвращенные из интерфейса COM, в класс коллекции BCL. Так что, я думаю, вы могли бы сказать, что я делаю это только в сценариях взаимодействия:).

2 голосов
/ 17 марта 2009

С StringBuilder это не количество строк , а количество символов . В общем; если вы можете предсказать длину, продолжайте и говорите об этом - но, поскольку она использует удвоение, нет перерасхода огромных при случайном перераспределении, если вам нужно просто использовать Add и т.д.

В большинстве случаев разница будет тривиальной и микрооптимизацией. Самая большая проблема с тем, чтобы не указывать размер, заключается в том, что, если в коллекции нет метода «обрезки», у вас может быть почти удвоенный размер, который вам действительно нужен (если вам очень не повезло).

0 голосов
/ 17 марта 2009

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

Я бы пошел с оценкой для других коллекций.

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