Влияние нескольких .ToUpper () 'ing - PullRequest
1 голос
/ 23 марта 2010

Это не вопрос преждевременной оптимизации как таковой. Что касается сборщика мусора и памяти в целом, что будут делать сотни ToUpper() операций (многие из которых могут быть дублированы) с программой, главным образом в отношении неизменности строк?

Ответы [ 3 ]

4 голосов
/ 23 марта 2010

Каждый вызов ToUpper создает новый экземпляр строки, даже если содержимое совпадает с оригиналом, и даже если строка уже существует в виде интернализованного строкового литерала.

Итак, влияние сотен ToUpper вызовов заключается в том, что вы создаете сотни строковых экземпляров. Если строки короткие, это не проблема, особенно если вы используете строки только в течение короткого времени. Сборщик мусора предназначен для эффективной обработки небольших недолговечных объектов.

Пример:

// Interned string literals are the same instance:
string a = "asdf";
string b = "asdf";
Console.WriteLine(Object.ReferenceEquals(a, b)); // True

// ToUpper naturally creates a new instance if the content is changed:
string c = b.ToUpper();
Console.WriteLine(Object.ReferenceEquals(b, c)); // False

// ToUpper creates a new instance even if the content is unchanged:
string d = c.ToUpper();
Console.WriteLine(Object.ReferenceEquals(c, d)); // False

// ToUpper will not intern strings:
string e = "ASDF";
string f = e.ToUpper();
Console.WriteLine(Object.ReferenceEquals(e, f)); // False

// Dynamically created strings can be interned manually:
string g = String.Intern(f);
Console.WriteLine(Object.ReferenceEquals(e, g)); // True
2 голосов
/ 23 марта 2010

Сотни? Почти ничего в большинстве случаев, если предположить, что они не огромные строки и у вас есть достаточное количество памяти. Сотни миллионов вполне могут оказать влияние.

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

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

1 голос
/ 23 марта 2010

Каждый .ToUpper() вызов создает новую строку. Таким образом, дополнительные .ToUpper() звонки определенно неэффективны. Разумно и профессионально стараться свести к минимуму столько ненужных и дублированных вызовов .ToUpper(), сколько возможно.

string Nacho = "cheesy"
Nacho = Nacho.ToUpper()
Nacho = Nacho.Trim().ToUpper()

. , , создает много строкового мусора.

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

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