| 
	| 
	
	| 
		
	| 
			
			 
			
				09.04.2009, 13:45
			
			
			
		 |  
	| 
		
			|  | Рассеянный профессор       |  | 
					Регистрация: 06.04.2009 
						Сообщений: 2,379
					 
		
 |  |  
	| 
	
 
	| Сообщение от Zeroglif |  
	| Вы используете 'if' плюс 'do-while', если уйти от 'if', который не нужен вообще, то достаточно 'while'. Остановка цикла не при чём. |  
	
 Ага, в начале думал об этом, но тогда код был другой, "иф" состоял из двух условий. А сейчас можно попробовать. |  |  
	| 
		
	| 
			
			 
			
				09.04.2009, 13:50
			
			
			
		 |  
	| 
		
			
			| ...       |  | 
					Регистрация: 09.03.2008 
						Сообщений: 216
					 
		
 |  |  
	| 
	
 
	| Сообщение от Riim |  
	| Я не хочу (без обид) вообще ни чего слышать про читабельность (в универсальном коде) в ущерб даже плюс одному байту кода |  
	
 Логика ясна, но у вас же есть границы? Иначе, зачем создавать объект 'TextNode', зачем такие длинные названия, зачем так много 'var'-ов, ведь это много лишних байтов.   |  |  
	| 
		
	| 
			
			 
			
				09.04.2009, 14:47
			
			
			
		 |  
	| 
		
			|  | Рассеянный профессор       |  | 
					Регистрация: 06.04.2009 
						Сообщений: 2,379
					 
		
 |  |  
	| 
	
 
	| Сообщение от Zeroglif |  
	| Логика ясна, но у вас же есть границы? Иначе, зачем создавать объект 'TextNode', зачем такие длинные названия, зачем так много 'var'-ов, ведь это много лишних байтов. |  
	
 Все локальные переменные компрессор сожмет до одного символа:
http://developer.yahoo.com/yui/compressor/ 
Про них можно не беспокоиться.
 
Что касается глобальных, то вы, верно, сказали "есть границы". Можно не создавать объекты и все переменные держать в window с именами "a", "b", "c", "d" и т. д. Хорошая помойка получится. Пожалуй, я действительно поспешил так однозначно заявив:
 
	
 
	| Цитата: |  
	| Я не хочу (без обид) вообще ни чего слышать про читабельность (в универсальном коде) в ущерб даже плюс одному байту кода после компрессора или плюс одному лишнему действию интерпретатора.
 
 |  
	
 Что бы ни допустить такой помойки все же приходится мириться с незначительным увеличением объема кода и уменьшением производительности (за счет обращения к свойствам объектов). 
Все эти методы с правильными именами, красиво разложенные по полочкам (по объектам) будут постоянно применяться, и это применение должно быть удобным. Но должно ли быть удобно (читабельно) написано содержимое этих методов? То есть я сначала пишу функцию читабельно в ущерб производительности, для того что бы потом, когда этот внесенный мной ущерб проявится, я мог зайти, удобно ее прочитать и исправить сделав нечитабельной. Глупо на мой взгляд.
 
	
 
	| Сообщение от Zeroglif |  
	| зачем так много 'var'-ов |  
	
 Лишних 'var'-ов на первый взгляд вроде не вижу. Каждый в своем уровне вложенности. Можно, например, вынести "f" выше к "div", но тогда DocumentFragment будет создаваться и в тех случаях, когда он не понадобится.
			
			
	
			
			
			
			
			
				  |  |  
	| 
		
	| 
			
			 
			
				09.04.2009, 16:24
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 25.02.2008 
						Сообщений: 707
					 
		
 |  |  
	| 
	
 
	| Сообщение от Riim |  
	| Дмитрий предложил вариант оптимизации производительности в ущерб объему кода. Ущерб слишком большой, а выигрыш в скорости мизерный (теоретически, не тестировал). |  
	
 Кстати, потестируйте. Теоретически, это уже будет быстрее в n раз. А если ещё учесть тормознутость каждой конкретной реализации .createElement и .createDocumentFragment - ещё прибавится. Хотя, Вам решать, что оптимизировать - скорость или объём кода, я лишь предложил. |  |  
	| 
		
	| 
			
			 
			
				09.04.2009, 17:56
			
			
			
		 |  
	| 
		
			|  | Рассеянный профессор       |  | 
					Регистрация: 06.04.2009 
						Сообщений: 2,379
					 
		
 |  |  
	| 
	
 
	| Сообщение от Dmitry A. Soshnikov |  
	| Теоретически, это уже будет быстрее в n раз |  
	
 Теоретически, процентов 10 максимум. Сейчас протестирую. |  |  
	| 
		
	| 
			
			 
			
				09.04.2009, 18:46
			
			
			
		 |  
	| 
		
			|  | Рассеянный профессор       |  | 
					Регистрация: 06.04.2009 
						Сообщений: 2,379
					 
		
 |  |  
	| Протестировал на "идеальном" случае, т. е. кол-во текстовых узлов в документе равно кол-ву подходящих для замены текстовых узлов. В таком случае разница в производительности особенно заметна. 
Код срабатывает множество раз, и каждый раз в документе появляются теги "а", которые сразу нужно убирать:
 
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% |  |  
	| 
		
	| 
			
			 
			
				09.04.2009, 18:59
			
			
			
		 |  
	| 
		
			|  | Рассеянный профессор       |  | 
					Регистрация: 06.04.2009 
						Сообщений: 2,379
					 
		
 |  |  
	| Можно еще regexp вынести как свойство callback-а. Чтоб не создавался каждый раз. |  |  
	| 
		
	| 
			
			 
			
				09.04.2009, 20:54
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 25.02.2008 
						Сообщений: 707
					 
		
 |  |  
	| 
	
 
	| Сообщение от 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 раз).
 
Впрочем, повторю, Вы сами определяете приоритет. |  |  
	| 
		
	| 
			
			 
			
				09.04.2009, 21:05
			
			
			
		 |  
	| 
		
			|  | Рассеянный профессор       |  | 
					Регистрация: 06.04.2009 
						Сообщений: 2,379
					 
		
 |  |  
	| Вы сравниваете обращение к свойству и вызов метода. Конечно второе медленней даже если метод пустой.Т. е. вы удалили весь лишний шум. Но при реальном применении, этот шум будет, и его нужно учитывать.
 Определитесь, что мы сравниваем два по разному написанных метода или "обращение к свойству" vs "вызов метода".
 |  |  
	| 
		
	| 
			
			 
			
				09.04.2009, 21:26
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 25.02.2008 
						Сообщений: 707
					 
		
 |  |  
	| 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(); один раз вызываются? Нет? А почему? А! Вы говорите об оптимизации по объёму кода; что ж, Вам решать (я это третий раз говорю уже). |  |  
 
 
 
 |  |