Циклы действительно быстрее наоборот?

Когда Вы преобразовываете.1 или 1/10 для базирования 2 (двоичный файл), Вы получаете повторяющийся шаблон после десятичной точки, точно так же, как попытка представить 1/3 в основе 10. Значение не точно, и поэтому Вы не можете сделать точной математики с ним с помощью нормальных методов с плавающей точкой.

259
задан Anders 3 November 2015 в 09:43
поделиться

7 ответов

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

Ответ, вероятно, будет зависеть от того, какой браузер вы используете. Некоторые результаты будут отличаться от результатов других.

1
ответ дан 23 November 2019 в 02:37
поделиться

Обожаю, много оценок, но нет ответа: D

Просто сравните против нуля всегда является самым быстрым сравнением

Таким образом, (a == 0) на самом деле быстрее возвращает True, чем (a == 5)

Оно маленькое и незначительное, и при 100 миллионах строк в коллекции его можно измерить.

то есть в цикле вверх вы могли бы сказать where i <= array.length и увеличить i

в цикле вниз вы могли бы сказать where i> = 0 и вместо этого уменьшить i.

Сравнение выполняется быстрее . Не "направление" петли.

1
ответ дан 23 November 2019 в 02:37
поделиться

Как вы это делаете сейчас не быстрее (кроме того, что это бесконечный цикл, я полагаю, вы хотели сделать i - .

Если вы хотите сделать это быстрее, сделайте:

for (i = 10; i--;) {
    //super fast loop
}

конечно, вы бы не стали заметьте это в таком маленьком цикле. Причина в том, что это быстрее, потому что вы уменьшаете i, проверяя, что он «истина» (он оценивается как «ложь», когда достигает 0)

4
ответ дан 23 November 2019 в 02:37
поделиться

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

Во всех случаях (если я не пропустил ни одного в моем чтении) самый быстрый цикл был:

var i = arr.length; //or 10
while(i--)
{
  //...
}
197
ответ дан 23 November 2019 в 02:37
поделиться

Это можно объяснить тем, что JavaScript (и все языки) в конечном итоге превратились в коды операций для запуска на ЦП. У ЦП всегда есть одна инструкция для сравнения с нулем, что чертовски быстро.

Кроме того, если вы можете гарантировать, что count всегда > = 0 , вы можете упростить его до :

for (var i = count; i--;)
{
  // whatever
}
6
ответ дан 23 November 2019 в 02:37
поделиться

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

Это потому, что только несколько механизмов Javascript (те, что указаны в списке JIT) фактически генерируют код машинного языка.

Большинство механизмов Javascript создают внутреннее представление исходный код, который они затем интерпретируют (чтобы понять, на что это похоже, посмотрите внизу этой страницы на Firefox SpiderMonkey ). Обычно, если фрагмент кода выполняет практически то же самое, но приводит к более простому внутреннему представлению, он будет работать быстрее.

Имейте в виду, что с простыми задачами, такими как добавление / вычитание единицы из переменной,

3
ответ дан 23 November 2019 в 02:37
поделиться

Использование оператора приращения префикса несколько быстрее. С постфиксом компилятор должен сохранить предыдущее значение как результат выражения.

for (var i = 0; i < n; ++i) {
  do_stuff();
}

Умный интерпретатор или компилятор увидит, что результат i ++ не используется, и не сохранит результат выражения, но не все движки js делать.

0
ответ дан 23 November 2019 в 02:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: