Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Поиск выражения в тексте (https://javascript.ru/forum/jquery/3317-poisk-vyrazheniya-v-tekste.html)

Riim 09.04.2009 13:45

Цитата:

Сообщение от Zeroglif
Вы используете 'if' плюс 'do-while', если уйти от 'if', который не нужен вообще, то достаточно 'while'. Остановка цикла не при чём.

Ага, в начале думал об этом, но тогда код был другой, "иф" состоял из двух условий. А сейчас можно попробовать.

Zeroglif 09.04.2009 13:50

Цитата:

Сообщение от Riim
Я не хочу (без обид) вообще ни чего слышать про читабельность (в универсальном коде) в ущерб даже плюс одному байту кода

Логика ясна, но у вас же есть границы? Иначе, зачем создавать объект 'TextNode', зачем такие длинные названия, зачем так много 'var'-ов, ведь это много лишних байтов. ;)

Riim 09.04.2009 14:47

Цитата:

Сообщение от Zeroglif
Логика ясна, но у вас же есть границы? Иначе, зачем создавать объект 'TextNode', зачем такие длинные названия, зачем так много 'var'-ов, ведь это много лишних байтов.

Все локальные переменные компрессор сожмет до одного символа:
http://developer.yahoo.com/yui/compressor/
Про них можно не беспокоиться.

Что касается глобальных, то вы, верно, сказали "есть границы". Можно не создавать объекты и все переменные держать в window с именами "a", "b", "c", "d" и т. д. Хорошая помойка получится. Пожалуй, я действительно поспешил так однозначно заявив:
Цитата:


Я не хочу (без обид) вообще ни чего слышать про читабельность (в универсальном коде) в ущерб даже плюс одному байту кода после компрессора или плюс одному лишнему действию интерпретатора.

Что бы ни допустить такой помойки все же приходится мириться с незначительным увеличением объема кода и уменьшением производительности (за счет обращения к свойствам объектов).
Все эти методы с правильными именами, красиво разложенные по полочкам (по объектам) будут постоянно применяться, и это применение должно быть удобным. Но должно ли быть удобно (читабельно) написано содержимое этих методов? То есть я сначала пишу функцию читабельно в ущерб производительности, для того что бы потом, когда этот внесенный мной ущерб проявится, я мог зайти, удобно ее прочитать и исправить сделав нечитабельной. Глупо на мой взгляд.

Цитата:

Сообщение от Zeroglif
зачем так много 'var'-ов

Лишних 'var'-ов на первый взгляд вроде не вижу. Каждый в своем уровне вложенности. Можно, например, вынести "f" выше к "div", но тогда DocumentFragment будет создаваться и в тех случаях, когда он не понадобится.

Dmitry A. Soshnikov 09.04.2009 16:24

Цитата:

Сообщение от Riim
Дмитрий предложил вариант оптимизации производительности в ущерб объему кода. Ущерб слишком большой, а выигрыш в скорости мизерный (теоретически, не тестировал).

Кстати, потестируйте. Теоретически, это уже будет быстрее в n раз. А если ещё учесть тормознутость каждой конкретной реализации .createElement и .createDocumentFragment - ещё прибавится. Хотя, Вам решать, что оптимизировать - скорость или объём кода, я лишь предложил.

Riim 09.04.2009 17:56

Цитата:

Сообщение от Dmitry A. Soshnikov
Теоретически, это уже будет быстрее в n раз

Теоретически, процентов 10 максимум. Сейчас протестирую.

Riim 09.04.2009 18:46

Протестировал на "идеальном" случае, т. е. кол-во текстовых узлов в документе равно кол-ву подходящих для замены текстовых узлов. В таком случае разница в производительности особенно заметна.

Код срабатывает множество раз, и каждый раз в документе появляются теги "а", которые сразу нужно убирать:
var text = 'ddffdfg [url]http://www.youtube.com/watch?v=iuOcLoqo5e0[/url] dsfsdfs';
var startTime = new Date();
for (var __i = 0; __i < 1001; __i++) {
	document.getElementById('div1').innerHTML =
	document.getElementById('div2').innerHTML =
	document.getElementById('div3').innerHTML = text;
	TextNode.each(callback);
}
alert((new Date()) - startTime);


Результат:
IE +8.59%
FF +6.49%
Opera +10.56%
Chrome +13.04%

В среднем +9,67%

В реальном документе сотни, а часто и тысячи текстовых узлов (отступы/табы для форматирования html в большинстве браузеров тоже считаются текстовыми узлами), и максимум 5-10 подходящих, т. е. полученный результат можно смело делить минимум на сотню.

Получаем +0,0967%

Riim 09.04.2009 18:59

Можно еще regexp вынести как свойство callback-а. Чтоб не создавался каждый раз.

Dmitry A. Soshnikov 09.04.2009 20:54

Цитата:

Сообщение от Riim
Теоретически, процентов 10 максимум.

Почти 100%.

У меня интерес всегда академический. Отрицать/не принимать очевидное - какой смысл? Есть разница - каждый раз создавать или один раз?

function test(callback) {
  callback();
}
var t1, t2;
function _callback1() {
  var div = document.createElement('div');
  var fragment = document.createDocumentFragment();
  var _div = div;
  var _fragment = fragment;
}
t1 = new Date().getTime();
for (var k = 0; k < 100000; k++) {
  test(_callback1);
}
t2 = new Date().getTime();
alert(t2 - t1);

function _callback2() {
  var _div = arguments.callee.div;
  var _fragment = arguments.callee.fragment;
}
_callback2.div = document.createElement('div');
_callback2.fragment = document.createDocumentFragment();
t1 = new Date().getTime();
for (var k = 0; k < 100000; k++) {
  test(_callback2);
}
t2 = new Date().getTime();
alert(t2 - t1);


Минимум в два раза быстрее (а где-то (IE6 на моей машине) в 5-8 раз).

Впрочем, повторю, Вы сами определяете приоритет.

Riim 09.04.2009 21:05

Вы сравниваете обращение к свойству и вызов метода. Конечно второе медленней даже если метод пустой.
Т. е. вы удалили весь лишний шум. Но при реальном применении, этот шум будет, и его нужно учитывать.
Определитесь, что мы сравниваем два по разному написанных метода или "обращение к свойству" vs "вызов метода".

Dmitry A. Soshnikov 09.04.2009 21:26

Riim, стоп. У вас операция document.createElement('div'); сколько раз вызывается? Один?

Цитата:

Сообщение от Riim
Вы сравниваете обращение к свойству и вызов метода.

Не понял. И там - test(_callback1), и там - test(_callback2) - вызов test с своим коллбэком.

Первый коллбэк (Ваш, где Вы создаёте каждый раз div и fragment):

function _callback1() {
  var div = document.createElement('div');
  var fragment = document.createDocumentFragment();
  var _div = div;
  var _fragment = fragment;
}


Второй коллбэк (предложенный, где div и fragment создались единожды и записались свойствами в коллбэк):
function _callback2() {
  var _div = arguments.callee.div;
  var _fragment = arguments.callee.fragment;
}
_callback2.div = document.createElement('div');
_callback2.fragment = document.createDocumentFragment();


Цитата:

Сообщение от Riim
Т. е. вы удалили весь лишний шум. Но при реальном применении, этот шум будет, и его нужно учитывать.

Какой ещё шум? До шума, действительно, и дела нет. Я Вам предложил заменить постоянное создание div и fragment на один раз. Другого я не касался.

Цитата:

Сообщение от Riim
Определитесь, что мы сравниваем два по разному написанных метода или "обращение к свойству" vs "вызов метода".

О чём Вы продолжаете говорить (и отрицать?), я не понимаю? =) Какой вызов метода, какое свойство? Если Вы под "вызов метода" подразумеваете document.createElement('div'); и document.createDocumentFragment(); vs. arguments.callee.div; и arguments.callee.fragment; - так я Вам это и предложил.

P.S.: ещё раз - у Вас document.createElement('div'); и document.createDocumentFragment(); один раз вызываются? Нет? А почему? А! Вы говорите об оптимизации по объёму кода; что ж, Вам решать (я это третий раз говорю уже).


Часовой пояс GMT +3, время: 22:55.