Image

Category:

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