melky, если оптимизация реально нужна, то конечно нужно её делать, я лишь хотел сказать, что прочитав статью не нужно всем дружно бросаться переписывать наш код под каждый интерпретатор и фапать на мистический наносекунды
Цитата:
|
Кстати, код для оптимизаций меняется не так сильно и совсем не уродуется
|
В твоём случае да, но я имел ввиду скорее общий случай оптимизаций (будь то алгоритмическая и т.д.), к примеру я переписал для будущей версии своего Collection метод extend (интерфейс как в jQuery) с классической реализации рекурсией на рекурсию развёрнутую в массив: оптимизация в среднем в 2.5 раза, но смысл кода реально понять сложнее.
Collection.extend = function (deep, target, var_args) {
deep = deep || false;
target = target || {};
var aLength = arguments.length,
aEl, key,
src, copy,
copyIsArray,
i = 1, j,
stack = [],
level,
last, lastEl;
// Внешний цикл по расширяющим аргументам
while (++i < aLength) {
if ((aEl = arguments[i])) {
// Цикл для эмуляции рекурсии
while (aEl) {
level = [];
// Цикл по свойствам объекта
for (key in aEl) {
src = target[key];
copy = aEl[key];
// Защита от бесконечного копирования
if (target === copy) { continue; }
// Рекурсивное копирование свойств
// (рекурсия развёрнута)
if (
deep && copy
&& ((copyIsArray = Array.isArray(copy)) || typeof copy === 'object')
) {
// Если копируемое свойство - массив
if (copyIsArray) {
copyIsArray = false;
clone = src && Array.isArray(src) ? src : [];
// Если копируемое свойство - объект
} else {
clone = src && typeof src === 'object' ? src : {};
}
// Запоминаем вложенность, чтобы в дальнейшем к ней вернуться
level.push({
target: target,
clone: clone,
aEl: aEl,
copy: copy,
key: key
});
} else {
target[key] = copy;
}
}
// Если на уровне имеются вложенности,
// то добавляем новый уровень в стек и
// проиводим сдвиг в крайне правый элемент нового уровня
if ((last = level.length)) {
stack.push(level);
last = level[last - 1];
// Ставим флаг, что элемент учавствует в обходе
last['__COLLECTION_TMP__'] = true;
// Устанавливаем новую точку отсчёта
target = last.clone;
aEl = last.copy;
// На уровне нет вложенностей
} else if ((last = stack.length)) {
j = stack.length;
while (j--) {
lastEl = stack[j][stack[j].length - 1];
// Если звено не имеет детей и уже было использовано,
// то удаляем крайне правый элемент и сдвигаем позицию обхода
if (lastEl['__COLLECTION_TMP__'] && !stack[j + 1]) {
lastEl.target[lastEl.key] = target;
target = lastEl.target;
aEl = lastEl.aEl;
stack[j].pop();
// В звене не осталось элементов,
// значит его можно удалить
if (!stack[j].length) {
stack.pop();
}
// Если первое условие не верно,
// значит продолжать цикл нет смысла
} else {
break;
}
}
// Устанавливаем новую позицию обхода
if ((last = stack.length)) {
last = stack[last - 1];
lastEl = last[last.length - 1];
lastEl['__COLLECTION_TMP__'] = true;
target = lastEl.clone;
aEl = lastEl.copy;
}
}
// Операция закончена
if (!stack.length && !level.length) {
break;
}
}
}
}
return target;
};