Подтвердить что ты не робот

Javascript: 10 x ускорение через цикл inline?

Я столкнулся с проблемой производительности со странным поведением javascript внутри моего Firefox (13.0.1). Новый Chrome показывает одинаковое поведение.

Когда я выполняю код javascript, который выглядит как ниже, результат довольно медленный. Тем не менее, я получаю примерно 10 ускорений, если я просто встраиваю содержимое внешний цикл над "j". Для моего примера приложения это означает, что я просто записывая его два раза при фиксированных значениях "j = 0" и "j = 1" соответственно, так как "m" равно 2. Конечно, я не хочу "m", быть жестко закодированным, поэтому я спрашиваю себя, что именно вызывает это замедление, когда используя реальный цикл?

Есть ли у кого-нибудь идеи?

Я запускаю код внутри веб-рабочего. Как ни странно, положительный эффект вложения не возникает, если я выполняю его в основном контексте javascript вместо рабочего контекста. Тем не менее, выполнение содержимого цикла только для одного значения "j" приводит к огромному ускорению во всех случаях. Может ли это также иметь отношение к управлению памятью?

Большое спасибо!

//m: very small, 1-2
for (j = 0; j < m; ++j) {
  var attrib = attributes[j];

  //n: very large, ~3*10^6 elements
  for (i = 0; i < n; ++i) {

    var data = largeBuffer[i];

    //nc: very small, 2-3
    for (c = 0; c < nc; ++c) {
      var component;
      //compute 'component
      //..
      attrib.typedArray[baseIdx + c] |= component;
    }

    baseIdx += nc;
  }
}
4b9b3361

Ответ 1

Это просто гипотеза. Я не очень хорошо знаю внутренние интерпретаторы JS.

Возможно, когда вы встраиваете внешний цикл, интерпретатор видит в 4 раза один и тот же код и тем самым запускает JIT. Наоборот, когда вы используете обычный цикл, код отображается только один раз JIT.

Опять же, это только гипотеза.