Что за приколы?

608
5
15
Код:
for (int i = 0, n = actions.length; i < n; i++)
В чём отличие от:
Код:
for (int i = 0, i < actions.length; i++)
?
 
Вроде очевидно. В первом варианте есть 2 переменная, которой присваивается длина массива. Во втором варианте сравнение напрямую. Два действия против одного.
 
Я так понял вызов .length может пересчитывать количество объектов, на что тратится время. И вообще, происходит вызов большого объекта.

В первом варианте, с самого начала мы только один раз обращаемся к объекту, получая только int переменную. Далее во всех итерациях идет просто сравнение двух чисел, без обращения к объекту (который очевидно сложнее, чем целочисленная переменная).
 
Agravaine написал(а):
Первый оптимизированный. Не знаю почему, но где-то советовали писать так.

Так стоит писать , думаю, только в таки случаях:
Код:
for (int i = 0, i < сумма(суперМассив) + еще куча расчетов; i++)
Чтобы каждую итерацию не производить одни и те же расчеты. А в случае с length не стоит.


.length не пересчитывает кол-во объектов.


actions.length настолько же быстрый, как и n. Это просто переменная в объекте.


Лучше бы вы писали ++i, чем задумывались о .length
 
Какая разница, где использовать? (я о скорости)
 
В сишке i++ это 2 операции, а ++i - одна.


Ясно все с вами :)


svk2140 написал(а):
++i просто синтаксически правильнее, что-бы не путать себя в коде, где там разница в скорости то?)

Вообще хрень сморозил :)
 
Dahaka написал(а):
В сишке i++ это 2 операции, а ++i - одна.


Ясно все с вами :)


svk2140 написал(а):
++i просто синтаксически правильнее, что-бы не путать себя в коде, где там разница в скорости то?)

Вообще хрень сморозил :)




Я и удалил поэтому.
Сейчас компиляторы умные, и такую херь скорей всего должны фиксить.
А вообще:
[font=verdana, geneva, lucida,]++i берется значение увеличивается на 1 и возвращается результат[/font]

[font=verdana, geneva, lucida,]i++ берется значение, сохраняется во временную переменную, значение увеличивается а возвращается значение из временной переменной[/font]
 
Надеяться на оптимизацию компилятора - последнее дело. Своей головой надо думать.
 
Dahaka написал(а):
Надеяться на оптимизацию компилятора - последнее дело. Своей головой надо думать.
Ну давай тогда писать не 
Код:
for(int i = 0; i < x; ++i)
А
Код:
for(int i = x-1; x != 0; --i)
 
Dahaka написал(а):
Ну, сравнивать же с нулём легче/быстрее, а пройдёмся по одним и тем же значениям.
 
Код:
for(int i = 0; i < x; ++i)
Код:
for(int i = x-1; x != 0; --i)
Второе не равносильно первому, т.к. порядок обработки элементов различен.
Тогда нужно:

Код:
for(int i = 0; i != x; ++i)
P.S. я хз, что быстрее !=0 или !=x; 0 ведь тоже где-то в памяти хранится, и к нему обращаются..
 
Я точно не знаю, но скорее всего все-таки быстрее. Потому что на ассемблерном уровне нужно сначала выгрузить значение из памяти в регистр, а потом сравнить. А для сравнения с нулем ничего выгружать не нужно. Значение сразу тестируется на 0. Но это прям микро-микро-микро оптимизация.
 
Лучше таки оптимизации кода оставить на разрабов компиляторов - они лучше знают(или должны знать), какая операция быстрее выполнится
 
Назад
Сверху