Почему for(var i = 0; i < 600000000000; i++) {} так долго работает в JavaScript

Я использую JS для решения задач в Project Euler время от времени. Для выполнения одной из задач мне пришлось выполнить около 600 миллиардов последовательных чисел. К моему удивлению, в NodeJS прошло около 14 часов.

Просто запустите приведенный ниже фрагмент, и ваш браузер зависнет на несколько часов (я пробовал Chrome и Firefox):

console.time('t')
for (var i = 0; i < 600851475143; i++) {}
console.timeEnd('t')

Для сравнения, в Java он работает около 200 мс на моей машине, 4 секунды, если я вычисляю квадратный корень каждого i,

Что происходит???

ОБНОВЛЕНИЕ: я знаю, что повторение каждого числа не было правильным способом решить эту конкретную проблему PE. Вопрос не об этом.

ОБНОВЛЕНИЕ 2: я ошибся насчет Java. Как правильно отметили люди, просто физически он не может так быстро бегать. Я просто использовал неправильный номер, извините.

1 ответ

Решение

Прежде всего, 200 мс и 4 секунды совершенно нелепы, потому что ваш процессор, скорее всего, может делать только до 4 миллиардов циклов в секунду (4 ГГц), даже если одна итерация цикла стоит 1 цикл, это все равно займет не менее 150 секунд. Однако даже пустой цикл будет стоить не менее 3 циклов на итерацию (при условии, что он не оптимизирован), вычисление квадратного корня добавляет 5-10 к каждой итерации, поэтому вы просто не делали 600 миллиардов квадратных корней за 4 секунды.

И я даже не могу воспроизвести, следующее работает вечно, как ожидалось:

class Test {
    public static void main(String[] args) {
        for (long i = 0; i < 600851475143L; ++i) {
        }
    }
}

затем

$ java -version
java version "1.7.0_55"
OpenJDK Runtime Environment (IcedTea 2.4.7) (7u55-2.4.7-1ubuntu1)
OpenJDK 64-Bit Server VM (build 24.51-b03, mixed mode)
$ javac test.java
$ java -cp . Test
Другие вопросы по тегам