Какой порядок времени занимает свойство .NET System.String.Length? - PullRequest
13 голосов
/ 14 мая 2010

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

Ответы [ 6 ]

23 голосов
/ 14 мая 2010

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

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

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

5 голосов
/ 14 мая 2010

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

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

3 голосов
/ 14 мая 2010

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

2 голосов
/ 14 мая 2010

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

1 голос
/ 14 мая 2010

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

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

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

0 голосов
/ 14 мая 2010

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

...