Лучшая практика для условия цикла - PullRequest
1 голос
/ 26 мая 2010

что считается наилучшей практикой в ​​этом случае?

for (i=0; i<array.length(); ++i)

или

for (i=array.length()-1; i>=0; --i)

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

итак, array.length() станет постоянным во время компиляции? если нет, то следует использовать второй подход ..

Ответы [ 7 ]

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

В большинстве случаев я ожидал бы, что array.length() будет реализован таким образом, что это O (1), так что это не будет реально влиять на производительность цикла. Если вы сомневаетесь или хотите убедиться, что это константа, просто сделайте это явно:

// JavaScript
var l = a.length;

for (var i=0; i<l; i++) {
  // do something
}

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

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

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

Версия 1 гораздо более широко используется и проще для понимания. Версия 2 иногда может быть немного быстрее, если компилятор не оптимизирует array.length () в константу, но ... insert your own premature optimization comment here

РЕДАКТИРОВАТЬ: будет ли оптимизирована функция array.length (), это будет зависеть от языка. Если язык использует массивы как «нормальные» объекты или массивы могут иметь динамический размер, это будет просто вызов метода, и компилятор не может предположить, что он возвратит согласованное возвращаемое значение. Но для языков, в которых массивы являются особым случаем или объектом (или компилятор просто очень умный ...), разница в скорости, вероятно, будет устранена.

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

Я бы сделал первый метод, так как он гораздо более читабелен, и я могу посмотреть, как вы перебираете цикл. Второй занял у меня секунду: (.

array.length будет оставаться постоянным, пока вы не измените массив.

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

Версия 2 не работает и будет повторяться от одного конца массива до 1. (исправлено)

Палка с версией 1. Она хорошо узнаваема и не дает читателю делать двойной дубль.

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

Версия 1 самая быстрая. для (я = 0; я

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

Для цикла for в моем собственном коде, хотя это, вероятно, излишне, я рано привык к написанию своих циклов так, что длина вычисляется ровно один раз, но цикл продолжается естественным образом:

int len = array.length();
for (int i=0; i<len; ++i) {
    doSomething(array[i]);
}

В наши дни я предпочитаю использовать средства «для каждого» там, где они доступны и удобны;они делают петли более легкими для чтения и надежными.В C ++ это было бы что-то вроде:

std::for_each(array.begin(), array.end(), &doSomething);
0 голосов
/ 26 мая 2010

for (i=0; i<array.length(); ++i) лучше для меня, но for (i=array.length()-1; i>=0; --i) - самый быстрый, потому что обычные процессоры быстрее всего проверяют условие, сравнивая 0 с условием, сравнивая с двумя переменными.стирание элементов из этого массива при итерациях.

...