Пишем быстрый JavaScript. Оптимизация функции обработки текста

Nov 11, 2007 23:41


Писать будем на примере стандартной функции 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 быстрее, чем два - спорно.

javascript

Previous post Next post
Up