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;
}
}
Ответы
Ответ 1
Это просто гипотеза. Я не очень хорошо знаю внутренние интерпретаторы JS.
Возможно, когда вы встраиваете внешний цикл, интерпретатор видит в 4 раза один и тот же код и тем самым запускает JIT. Наоборот, когда вы используете обычный цикл, код отображается только один раз JIT.
Опять же, это только гипотеза.