|
|
|
November 19th, 2007
06:22 pm - forEach vs. for
Необходимость пройтись по массиву возникает довольно часто. Как это сделать наиболее быстро?
// Нервным поборникам красивого кода дальше лучше не читать ;)
Код
Для forEach:
arr.forEach(function (item) {
var res = " " + item + " ";
});
В случае, если браузер не поддерживает forEach, в игру вступает:
if (!Array.prototype.forEach) {
Array.prototype.forEach = function (callback, thisObject) {
thisObject = thisObject || window;
for (var index = 0, length = this.length; index < length; index++) {
callback.apply(thisObject, [this[index], index, this]);
}
}
}
Для for:
for (var j = 0, l = arr.length; j < l; j++) {
var res = " " + arr[j] + " ";
}
Кроме того, проверим метод each, которым библиотека prototype расширяет Array:
arr.each(function (item) {
var res = " " + item + " ";
});
Тестируем
Метод замера времени
Выполним приведенный выше код 5000 раз для массива из 40 элементов.
Результаты:
Время приведено в миллисекундах.
Firefox 2.0.0.9:
| Array.prototype.forEach |
906 |
| Prototype::each |
1422 |
| for |
609 |
IExplorer 6.0:
| Array.prototype.forEach |
1641 |
| Prototype::each |
1843 |
| for |
750 |
Opera 9.24:
| Array.prototype.forEach |
515 |
| Prototype::each |
453 |
| for |
188 |
Делаем выводы
Если у вас много проходов по массивам и очень жесткие рамки по скорости выполнения, вспомните про старый добрый for ;)
|
November 12th, 2007
02:07 am - Re: Пишем быстрый JavaScript. Оптимизация функции обработки текста В предыдущем посте я написал: "Один replace быстрее, чем два".
В комментариях вот тут мне дали ссылку на замечательную статью "Faster JavaScript Trim", в которой автор провел исследование на скорость разных вариантов регулярных выражений реализующих trim.
Что же касается двух replace. На коротких строках два replace проигрывают за счет больших накладных расходов на их осуществление. Зато на длинных, когда начинает заметно сказываться время сканирования строки, сложное, получившееся из двух простых регулярное выражение, дает о себе знать в полный рост.
Резюме 1: выбираем решение под задачу. Оба варианта имею право на существование.
Резюме 2: пост написал не зря. Получил офигительную ссылку. Да и второе предложение пока никто не опроверг :)
|
November 11th, 2007
11:41 pm - Пишем быстрый JavaScript. Оптимизация функции обработки текста
Писать будем на примере стандартной функции trim или strip, как она называется в prototype. Эта функция удаляет начальные и конечные пробельные символы. Cмотрим реализации "лидеров" prototype: strip: function () { return this.replace(/^\s+/, '').replace(/\s+$/, ''); } jQuery: trim: function (t){ return (t||"").replace(/^\s+|\s+$/g, ""); } Пишем быстрый вариант Кому-то покажется, что тут нечего оптимизировать, но мы все-таки сделаем два предположения: - Один replace быстрее, чем два.
- Создание объекта Regexp - это долго.
Напишем свою функцию QuickTrim: function QuickTrim (str) { return str.replace(QuickTrim.exp, ''); } QuickTrim.exp = /^\s+|\s+$/g; Тестируем Метод замера времени Bызовем эту функцию 50000 раз, на вход подадим такую строчку: " ssssss ". Результаты: Время приведено в миллисекундах. Firefox 2.0.0.9: | Prototype | 578 | | jQuery | 391 | | QuickTrim | 390 | IExplorer 6.0: | Prototype | 1140 | | jQuery | 672 | | QuickTrim | 391 | Opera 9.24: | Prototype | 1266 | | jQuery | 1109 | | QuickTrim | 1079 | Делаем выводы Справедливость первого предположения очевидна. Второе же справедливо только для IExplorer. Рекомендации: Объединяйте регулярный выражения, если это возможно. Кешируйте создаваемые инстанции регулярных выражений, так вы выиграете в IExplorer, не проиграв в других браузерах. Update: Один replace быстрее, чем два - спорно.
|
October 26th, 2007
12:58 pm - Firefox 2.0.0.8
Совсем недавно вышла новая версия Firefox 2.0.0.8. Вышла так, что уже на следующей неделе они обещают выпустить 2.0.0.9. Конкретно я пострадал из-за Bug 400421 – Removing AREA element makes the image disappear. Текущее решение:
var map = document.getElementById("myMap"), parent = map.parentNode; // удаляем map из DOM parent.removeChild(map); ... // здесь удаляем что нужно // возвращаем map в DOM parent.appendChild(map);
Теперь вот думаю, можно ли будет убрать эту зачинку после выхода новой версии.С одной стороны уже будет некоторое количество людей, которые не обновятся и будут видеть проблему, а с другой, количество этих людей будет исчезающе мало.
|
|
|