Как рассчитать, что максимальное количество раз для цикла может работать в Javascript? - PullRequest
1 голос
/ 24 ноября 2011

В Javascript, если у нас есть следующий код:

var j = 0;

for(i=0; i<j; i++){
  //JS Code
}

В этом коде, от чего зависит максимальное значение переменной j (то есть значение, до которого браузер не будет зависать) будет зависеть от (например, может ли ОЗУ машины или процессор или код выполняется в цикле)?

И можно ли рассчитать это максимально допустимое значение?

Это необходимо, поскольку существует большой массив, который необходимо обработать.

Спасибо за любые предложения заранее.

Ответы [ 2 ]

1 голос
/ 24 ноября 2011

Обычная практика, позволяющая поддерживать отзывчивость пользовательского интерфейса при обработке больших объемов данных, называется чанкингом.Вы вырезаете группы элементов и используете setInterval или setTimeout, чтобы завершить цикл по каждой группе.

1 голос
/ 24 ноября 2011

Нет, вы не можете рассчитать это, оно слишком сильно варьируется от браузера к браузеру. Некоторые браузеры делают это по времени (например, ваш код выполнялся более X секунд, не возвращаясь в браузер; в Firefox 7 значение по умолчанию составляет 10 секунд, но пользователь может изменить его ), другие браузеры делают это это по количеству операций ( IE, например ).

Лучше всего рефакторинг вашего кода, чтобы вы даже не начали приближаться к пределу. Если у вас есть большой кусок работы, разбейте его на куски, а затем запускайте куски один за другим, используя setTimeout со значением времени ожидания 0. Это возвращает браузеру (в течение более 0 миллисекунд; сколько именно будет зависеть от браузера и от того, что происходит на странице).

Вот пример подсчета до 10 000 000 в 100 000 итерационных блоков:

function toAMillion() {
  var counter = 0,
      limit = 10000000,
      chunk = 100000;

  doAChunk();

  function doAChunk() {
    var target = Math.min(limit, counter + chunk);

    while (counter < target) {
      ++counter;
    }

    if (counter < limit) {
      // Schedule next chunk
      setTimeout(doAChunk, 0);
    }
    else {
      // Done
      display("Done, counter = " + counter);
    }
  }
}

Живая копия

...