Подтвердить что ты не робот

Стоит ли делать массив array.length или list.count в цикле

Я знаю, что в JavaScript создание цикла for следующим образом: for(int i = 0; i < arr.length; i++) является дорогостоящим, поскольку он каждый раз вычисляет длину массива. Является ли это поведение дорогостоящим в С# для списков и массивов. Или во время компиляции он оптимизирован? Что же касается других языков, таких как Java, как это обрабатывается?

4b9b3361

Ответ 1

В С# это не дорого. Во-первых, нет "расчета": запрос длины в основном является элементарной операцией благодаря встраиванию. Во-вторых, поскольку (в соответствии с его разработчиками), компилятор распознает этот шаблон доступа и фактически оптимизирует любые (избыточные) пограничные проверки для доступа на элементах массива.

И, кстати, я считаю, что что-то подобное верно для современных виртуальных машин JavaScript, а если это еще не так, это будет очень скоро, поскольку это тривиальная оптимизация.

Ответ 2

  • Все массивы .Net имеют поле, содержащее длину массива, поэтому длина не вычисляется при использовании, а во время создания.

  • . Виртуальная машина .Net очень хороша в том, чтобы по возможности исключать проверки границ, это один из тех случаев, когда проверка границ перемещается за пределы цикла (в большинстве ситуаций, и если это не просто 2 служебных служебных инструкций).

Edit:

Проверка границ массива

Ответ 3

Почти на любом языке ответ будет "это зависит".

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

Это вряд ли будет определено спецификацией языка.

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

Но будьте осторожны с другими потоками...

Ответ 5

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

Ответ 6

Я полагаю, что если вы используете метод расширения Linq Count(), он может рассчитывать каждый раз, когда он вызывается.