2013-08-23 7 views
5

Я никогда не видел учебника или какой-либо лекции, в которой был показан классический для цикла с последующим приращением.pre-increment vs post-increment - for-loop speed

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

Если вы используете постинкремент, переменный «я» будет храниться в кэше, прежде чем он получит приращение! Но это не имеет смысла, потому что команда заканчивается прямо.

На мой взгляд, это имеет смысл:

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

Если вы не понял до сих пор, я иду немного дальше (СРЮ за мой английский):

В первом контуре :

  1. Кэш-значение фактического значения i. (Примечание: не двигаться между ними, так что нет причин, чтобы сделать это)
  2. Increment я
  3. Смелее

Во втором цикле:

  1. Increment я непосредственно
  2. Go вперед.

Таким образом, вторая петля более совершенна без потери качества. Любые другие мнения?

+1

Единственный способ узнать, является ли второй цикл более эффективным, - это измерить его (при условии, что сгенерированный код сборки сгенерирован отдельно). С 'int' я сомневаюсь, что это имеет значение. Возможно, с некоторыми типами итераторов. ** Редактировать ** Я говорю C++ здесь. – juanchopanza

+2

Когда вы говорите, что «переменная * будет кеширована *», вы используете какое-либо понимание или исследование ситуации, или вы просто спекулируете? –

+6

Я видел тэг C++, но потом он исчез, и я вижу только java, поэтому я разместил dup для java. –

ответ

6

В Java нет смысла думать на этом уровне. Среда выполнения Java настолько удалена от того, что вы буквально пишете в исходном коде Java, что такое рассуждение теряет смысл. В частности, JIT-компилятор будет деформировать ваш код до непонятности на уровне машинного кода.

+0

Значит, неважно, в каком случае вы его пишете, компилятор делает это к тому, что ему принадлежит? Я бы учил своих учеников таким образом, пост-и предварительное условие (если бы я был учителем), потому что у этого есть некоторые «базовые знания», которые всегда могут быть интересными. Но интересно, что это не имеет значения. Thx, для вас ответ! :) – codepleb

+0

Java-компилятор Just-in-Time делает так много более сложных вещей, которые почти не входят даже в изображение. Например, он может стереть весь цикл *, если он понимает, что он не имеет побочных эффектов. –

+0

Это может быть правильно, но логика программирования будет более подходящей, если я сделаю это «по-моему», я понимаю это. Конечно, это может быть неважно, но почему я не должен писать логику, компилятор также писал бы? В любом случае, хороший собеседник, но я бы не изменил то, что я делаю в данный момент. :) – codepleb