Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #31 (permalink)  
Старый 08.04.2009, 20:16
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Цитата:
Универсальные функции обычно и становятся узкими местами. Не лучше ли подумать об этом сразу, чем возвращаться потом
нет, потому что заранее неизвестно, где будет узкое место. И вместо оптимизации всего кода, нужно оптимизировать конкретные места. А вообще, как сказал один чувак "если ты привык к такому стилю и можешь при этом эффективно заниматься проектом, то отлично. Пока кому-то другому не прийдется его отлаживать". Т.е. плюс в производительности (а это еще надо доказать на реальном проекте, мне вот так сходу не очевидно), но минус в сложностях поддержки проекта
Цитата:
А чем плох лишний уровень вложенности? Ты же за читаемость.
тем что он лишний и это как раз про читабельность
Цитата:
Из-за одного такого случая вряд ли что-то изменится. Но если весь код писать так, то меняется, и очень даже заметно
это все теория, нужен реальный (т.е. не теоретический) проект/страничка, выполненные, например, мной и тобой, на котором можно было бы сравнить производительность. Или может у тебя есть результаты подобных тестов, или статьи известных авторов на тему
Цитата:
Я вот только что был на qip.ru. У меня почта там. Зайди и посмотри, как тормозит почтовый интерфейс напичканный ajax-ом. При нажатии на ссылку запускающую javascript аж флеш-банеры подвисают. А теперь зайди на gmail
1) это ничего не говорит про экономию на операторах, это говорит только о том, что gmail сделан лучше, а в чем именно причина - неизвестно 2) это довольно серьезные сервисы (для большинства сайтов не думаю, что ты заметишь свои оптимизации, разве что отдельные в отдельных местах) и для таких проектов вряд ли оправдано использование популярных фреймворков
Ответить с цитированием
  #32 (permalink)  
Старый 08.04.2009, 21:19
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от x-yuri
нет, потому что заранее неизвестно, где будет узкое место
Любая универсальная функция, это уже 100% узкое место, как бы идеально она не была оптимизирована, т. к. неизвестно заранее где она найдет себе применение. А рано или поздно она найдет себе применение в месте, где требуется высокая производительность. И тогда появится необходимость открыть ее и подумать над тем, как бы ускорить ее еще хоть на чуть-чуть. И тут уже даже экономия на спичках окажется эффективна. Зачем откладывать эту работу на потом, когда будут сроки.

Сообщение от x-yuri
но минус в сложностях поддержки проекта
Для того кто будет работать с моим кодом может и так(если у него мало опыта). Для меня же это скорее плюс, т. к. я сильнее привязываю к себе заказчика. Студент Вася, помучившись недельку с "этим странным javascript-ом", откажется от работы, и позвонят опять мне. Я не говорю, что нужно специально писать запутанно, но и беспокоиться о Васе в ущерб себе не нужно. А при работе в группе заранее обговариваются правила оформления кода. И раз мне платят за какой-то определенный стиль, то и вопросов нет.

Сообщение от x-yuri
тем что он лишний и это как раз про читабельность
Я уже совсем запутался. При всем своем желании, я не могу признать такой код:
if (! div.firstChild ||
            (div.innerHTML == noda.nodeValue))
                return;
//

более читабельным, чем такой:
if (div.firstChild && div.innerHTML != noda.nodeValue) {
    //
}


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

Сообщение от x-yuri
нужен реальный (т.е. не теоретический) проект/страничка, выполненные, например, мной и тобой
Я же привел ссылки. Или теперь уже нужно что бы это были не чьи то сайты. А потом что понадобится?


Сообщение от x-yuri
на котором можно было бы сравнить производительность
Неужели так трудно написать:
var startTime = new Date();
for (var __i = 0; __i < 100001; __i++) {
	//
}
alert((new Date()) - startTime);

И сравнивай сколько хочешь.

Сообщение от x-yuri
Или может у тебя есть результаты подобных тестов
Три 48-листовые тетради исписаны результатами.

Сообщение от x-yuri
а в чем именно причина - неизвестно
По моему очевидно, что в кривом javascript-е.
Ответить с цитированием
  #33 (permalink)  
Старый 08.04.2009, 22:21
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Цитата:
Создается ощущение, что это уже предвзятое мнение, просто для того что бы быть несогласным со мной
ни в коем случае, например, вот здесь. Могу еще поискать источники

Цитата:
Я же привел ссылки. Или теперь уже нужно что бы это были не чьи то сайты. А потом что понадобится?
у меня нету доступа ни к google-, ни к qip-серверам. Я не могу переписать ни одну из их страничек и сравнить разницу в производительности

Цитата:
Неужели так трудно написать:
var startTime = new Date();
for (var __i = 0; __i < 100001; __i++) {
//
}
alert((new Date()) - startTime);
И сравнивай сколько хочешь
не трудно, но у меня пока такой необходимости не возникало. Т.е. когда тормоза были из-за js. А причин сравнивать производительность отдельных операторов не вижу смысла пока. Вижу причины искать узкие места, но ты такую деятельность похоже полностью исключаешь. Но откуда тогда взялось это выражение?

А по поводу твоих тестов, одни и те же операции во всех браузерах с одинаковой скоростью выполняются? А от версии к версии это меняется?

Цитата:
По моему очевидно, что в кривом javascript-е
только не понятно, изменит что-то запись всех переменных в одном var, for, преобразование while -> do-while etc
Ответить с цитированием
  #34 (permalink)  
Старый 08.04.2009, 23:33
...
Отправить личное сообщение для Zeroglif Посмотреть профиль Найти все сообщения от Zeroglif
 
Регистрация: 09.03.2008
Сообщений: 216

if (div.firstChild && div.innerHTML != noda.nodeValue) {


Бог с ней с читабельностью, а зачем это вообще нужно?
Ответить с цитированием
  #35 (permalink)  
Старый 09.04.2009, 03:55
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

давайте тогда свой текущий вариант приведу:
var TextNode = {
    each: function(callback, parent) {
        var childNodes = (parent || document.body).childNodes;
        length = childNodes.length;
        for (var i=0; i < length; i++) {
            var I = childNodes[i];
            if( I.nodeType == 1 )
                arguments.callee(callback, I);
            elseif( I.nodeType == 3 )
                callback(I, i);
        }
    }
};
 
window.onload = function() {
    TextNode.each(function(noda) {
        var div = document.createElement('div');
        div.innerHTML = noda.nodeValue.replace(/(http\:\/\/www\.youtube\.com\/watch\?v\=[0-9a-z]{11})/gi, '<a href="$1">$1</a>');
        if (! div.firstChild ||
            (div.innerHTML == noda.nodeValue))
                return;
        var f = document.createDocumentFragment();
        while (div.firstChild)
            f.appendChild(div.firstChild);
        noda.parentNode.replaceChild(f, noda);
    });
};

вариант Riimа, Поиск выражения в тексте
не считаю, что все должны писать как я, мне скорее интересно, действительно ли оправдана такая экономия на каждом операторе, пусть даже и в библиотеках
div.firstChild: в ie div.innerHTML = ' '; ничего в div не добавляет, т.е. "пустые" текстовые ноды удаляются, при этом нужно в другом месте либо на каждой итерации проверять текущую длину (а не считать ее один раз), либо делать в итерации проверку, что теукщий узел существует, а именно здесь:
div.innerHTML != noda.nodeValue: чтобы не выполнять лишних действий, когда текущий узел останется таким же каким и был
Ответить с цитированием
  #36 (permalink)  
Старый 09.04.2009, 07:03
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от x-yuri
браузерах с одинаковой скоростью выполняются? А от версии к версии это меняется?
Вот потому тетрадей 3, а не 1. Все меняется, но соотношение очень редко. Если одна операция в 2 раза медленней в одном браузере, то 95% она будет медленней и в других. И в следующих версиях тоже.

Сообщение от x-yuri
А причин сравнивать производительность отдельных операторов не вижу смысла пока. Вижу причины искать узкие места, но ты такую деятельность похоже полностью исключаешь
Нет, не исключаю. Просто у меня нет необходимости в ней. Зная производительность каждого оператора, можно писать функцию и параллельно просчитывать ее производительность. Дальше сразу ясно, где и когда она станет узким местом. И когда это случится, сразу будет ясно в каком направлении копать.

Сообщение от x-yuri
только не понятно, изменит что-то запись всех переменных в одном var, for, преобразование while -> do-while
Я уже писал, что из-за одного случая ничего не изменится. Нужно стараться ВСЕ писать как можно лучше.

Сообщение от x-yuri
у меня нету доступа ни к google-, ни к qip-серверам
И теперь можно писать, как вздумается? По-моему нужно стараться становиться лучшим программистом, чем есть.
Может моя экономия на спичках не так эффективна, как мне/тебе хотелось бы, но я хоть что-то стараюсь для этого делать.

----

Ну ладно, вот с этим:
if (! div.firstChild ||
            (div.innerHTML == noda.nodeValue))
                return;

еще можно мириться, но не менять while на do-while. Мне кажется, что любой хороший программист должен стараться избавлять логику программы от лишних действий. К тому же настолько очевидных.

----

Что касается авторитетных мнений, то ты сам сказал, что копаешься в Jquery. Там же всюду экономия на спичках, как в объеме кода так и в производительности. Чем тебе не авторитетное мнение.
Возьми любой другой фреймворк кроме PrototypeJs. Везде это есть. И в PrototypeJs тоже есть, только у меня создалось впечатление, что автор сего творения, создавая метод, не задумывается над вопросом: "сжать его или ускорить?", и лепит первую оптимизацию, что придумалась. В результате часто методы, на которых половина фреймворка держится, оказываются, почему то сжаты, а там где можно было спокойно сжимать, явная оптимизация производительности. Вот и появляются те самые узкие места, которые теперь искать нужно. А ведь можно было сразу их исключить. В результате PrototypeJs самый тормозной фреймворк из известных, и чуть более сложные интерфейсы на его основе (lightbox например) тормозят значительно заметнее аналогичных на Jquery.
Ответить с цитированием
  #37 (permalink)  
Старый 09.04.2009, 08:29
...
Отправить личное сообщение для Zeroglif Посмотреть профиль Найти все сообщения от Zeroglif
 
Регистрация: 09.03.2008
Сообщений: 216

Сообщение от Riim
Мне кажется, что любой хороший программист должен стараться избавлять логику программы от лишних действий.
Поэтому для каждой! ноды вы создаёте элемент и так далее. Я задал выше вопрос, неужто никто не видит, что до разговора о спичках, нужно ошибки логики устранить...
Ответить с цитированием
  #38 (permalink)  
Старый 09.04.2009, 08:38
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Цитата:
поэтому для каждой! ноды вы создаёте элемент и так далее. Я задал выше вопрос, неужто никто не видит, что до разговора о спичках, нужно ошибки логики устранить...
то, что можно один раз создавать div и DocumentFragment? Да (собственно, идея Dmitry A. Soshnikov) И это скорее оптимизация, чем ошибка логики
Но речь не о том. Дальше что? Исправили. Нужно дальше оптимизировать?
p.s. Riim, авторитеность jQuery сомнительна - Сторонние библиотеки - быть или не быть?
Ответить с цитированием
  #39 (permalink)  
Старый 09.04.2009, 08:40
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Zeroglif
что до разговора о спичках, нужно ошибки логики устранить
Похоже вы сами еще не до конца разобрались в логике кода.
Если видите ошибки, приводите свой вариант.

Сообщение от Zeroglif
Поэтому для каждой! ноды вы создаёте элемент и так далее
Можно и без этого обойтись. Я спорю на тему "как оптимизировать код" на примере window.onload, но это плохой пример т. к. это одноразовый код. Я уже писал что мне все равно как он оптимизирован. Я просто взял несколько моментов из него как примеры.

Сообщение от Zeroglif
Я задал выше вопрос, неужто никто не видит
x-yuri вам ответил на него. В постах выше я 2 раза пояснял эту строку. Читайте внимательней.
Ответить с цитированием
  #40 (permalink)  
Старый 09.04.2009, 08:43
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Riim
x-yuri вам ответил на него. В постах выше я 2 раза пояснял эту строку. Читайте внимательней.
Если все равно не понятно, запустите:

window.onload = function() {
	TextNode.each(function(noda) {
		var div = document.createElement('div');
		div.innerHTML = noda.nodeValue.replace(/(http\:\/\/www\.youtube\.com\/watch\?v\=[0-9a-z]{11})/gi, '<a href="$1">$1</a>');
		if (div.firstChild && div.innerHTML != noda.nodeValue) {
			alert('1');
		}
	});
	
	TextNode.each(function(noda) {
		var div = document.createElement('div');
		div.innerHTML = noda.nodeValue.replace(/(http\:\/\/www\.youtube\.com\/watch\?v\=[0-9a-z]{11})/gi, '<a href="$1">$1</a>');
		//if (div.firstChild && div.innerHTML != noda.nodeValue) {
			alert('2');
		//}
	});
	
};


Только body получше заполните
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск в строке другой подстроки средствами JS YAN Общие вопросы Javascript 13 23.07.2013 09:41
Поиск на странице no_name jQuery 4 07.09.2010 13:26
построение XPath выражения endryha Общие вопросы Javascript 5 11.03.2009 17:00
Для чего ограничен поиск? ZoNT Сайт Javascript.ru 4 01.10.2008 15:55
Поиск в массиве через JavaScript Noran Общие вопросы Javascript 0 10.08.2008 17:31