Какой порядок времени имеет свойство .NET System.String.Length?

У меня кто-то советовал мне избегать многократного вызова String.Length, потому что он был пересчитан каждый раз, когда я его вызывал. Я предположил, что String.Length работает в O (1) раз. Является ли String.Length более сложным?

Ответ 1

Плохой совет - String.Length - это действительно O (1). Это не похоже на strlen в C.

По общему признанию, это не гарантировано в документах, насколько я могу судить, но неизменность строк делает это довольно глупой вещью, чтобы не делать O (1). (И не только O (1), но и очень быстрое постоянное время.)

Честно говоря, если кто-то дает такой совет, я бы стал немного более скептически относиться к другим советам, которые они могут предоставить...

Ответ 2

String.Length - O (1). Причина, по которой люди говорят вам не называть ее в цикле, это потому, что это доступ к свойствам, который является таким же, как вызов метода. В действительности один дополнительный вызов метода редко делает какие-либо существенные различия.

Как всегда, не запускайте код, кэширующий все вызовы String.Length, если ваш профайлер не говорит об этом как источник проблемы с производительностью.

Ответ 3

Напомним, что строки неизменяемы. System.String.Length никогда не изменяется.

Ответ 4

Как утверждали другие, String.Length является постоянным свойством. Если вы действительно заботитесь о производительности (или имеете значительные итерации), вы можете присвоить ее значение переменной локального целого один раз и прочитать это много раз (в цикле и т.д.). Это даст оптимизатору больше шансов выделить это значение регистру CPU. Доступ к свойству является гораздо более дорогостоящей операцией, чем переменная стека или регистр.

Ответ 5

Нет, он не пересчитывается. Строковый тип является неизменным.

Чтобы сделать это дальше, в соответствии с директивами .NET Framework , свойство объекта, который является очень статичным и нелетучим по своей природе, будет создан как свойство. Если свойство должно быть изменчивым, которое требует пересчета при каждом вызове, оно должно быть доступно как метод.

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

Ответ 6

В соответствии с внутренними комментариями свойство String.Length представляет собой одну инструкцию, которая не запускает цикл for. Следовательно, это операция O (1).