Удалить против нового экземпляра - PullRequest
1 голос
/ 23 ноября 2010

Мне интересно, как лучше вообще программировать на .NET с экземплярами классов, которые содержат метод Remove.

Вопрос: если у меня есть StringBuilder sb с некоторыми данными, умнее ли этоиспользуйте .Remove (0, sb.Length) или для создания нового экземпляра и оставьте старый для GC для сбора.Мне известно о нескольких факторах, поэтому я хотел бы узнать ваше мнение по этому поводу.

Спасибо,

Санджин

Ответы [ 3 ]

2 голосов
/ 23 ноября 2010

В общем, создайте новый.

Система памяти .NET ориентирована на быстрое создание и удаление большого количества небольших недолговечных объектов. StringBuilder.Remove () может быть медленнее.

Для очень больших данных (более 80 КБ) правила немного изменяются в зависимости от множества факторов.

2 голосов
/ 23 ноября 2010

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

Такое повторное использование микрооптимизации просто сбивает с толку любого читателя о намерениях кода.

1 голос
/ 23 ноября 2010

Не используйте .Remove(0, sb.Length), используйте .Clear(). Его легче читать, и если Remove не был оптимизирован для этого особого варианта использования, Clear тоже будет быстрее.
Или просто выделите новый StringBuilder. Сам StringBuilder легок, поэтому я не думаю, что использовать новый будет дорого.
Я обычно не стал бы выделять Clear() и выделять новый StringBuilder, основываясь на преимуществах производительности одного, но на которых создается лучший читаемый код. И это зависит от вашего варианта использования. Не оптимизируйте микро, если только ваш профилировщик не показал, что это необходимо.
По моему опыту, вы выделяете новый StringBuilder в начале какого-либо метода и вызываете ToString только при создании возвращаемого значения функции. В этом случае глупо усложнять интерфейс функции только для повторного использования StringBuilder.

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

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

...