2013-03-07 3 views
2

Какой из них более эффективен?Какая из циклов более эффективна в javascript?

// < 11 
for(var i = 0; i < 11; i++){ ... } 

или

// <= 10 
for(var i = 0; i <= 10; i++){ ... } 

Я не знаю точно, как для функции работает, но я предполагаю, что < 11 более effiecient, потому что в <= 10, кажется, что в каждом из 10 сравнений имеет слишком проверить если он тоже равен, а не меньше, поэтому он должен сделать 2 сравнения вместо одного.

Я прав, или как это работает?

+7

[jsPerf.com] (http://jsperf.com), выглядит как первый [был пренебрежимо быстрее] (http://jsperf.com/loopcompare-15272284) на FF18, но действительно ли это имеет значение? – Chad

+8

Я вижу, что ты нашел бутылочную горловину своего приложения ... поздравляю. BTW, 'i ++' ?! это может быть намного быстрее, используя 'i = i + 1'! проверьте это. – gdoron

+0

компилятор очень умный, он всегда выполняет одно сравнение как i <11. код i <= 10 преобразуется в i <11. –

ответ

6

В любое время у вас есть вопрос производительности, всегда получить его на jsPerf.com.

С this test case:

  • В FF18 петля первого пренебрежимо быстрее
  • В FF19 петля второй пренебрежимо быстрее.
  • В Chrome 25 они точно то же самое.

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

+1

В моем FF19 и Chromium 24.0.1312.70 на Linux второй цикл пренебрежимо быстрее. ;) –

+0

Просто идет, чтобы показать, как мало это имеет значение :) – Chad

6

Если есть какая-либо разница, это было бы очень мало. Вы должны использовать код, который легче поддерживать. Обычно оператор < предпочтителен, поскольку цикл с 0, когда счетчик равен < x, дает x итераций.

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

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

operator: true when result is: 
---------- --------------------- 
<   negative 
<=   not positive 
==   zero 
>   positive 
>=   not negative