Пишем быстрый JavaScript. Оптимизация функции обработки текста
Писать будем на примере стандартной функции trim или strip, как она называется в prototype.
Эта функция удаляет начальные и конечные пробельные символы.
Cмотрим реализации "лидеров"
prototype:
return this.replace(/^\s+/, '').replace(/\s+$/, '');
}
jQuery:
return (t||"").replace(/^\s+|\s+$/g, "");
}
Пишем быстрый вариант
Кому-то покажется, что тут нечего оптимизировать, но мы все-таки сделаем два предположения:
- Один replace быстрее, чем два.
- Создание объекта Regexp - это долго.
Напишем свою функцию QuickTrim:
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 быстрее, чем два - спорно.