08.04.2009, 20:16
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Цитата:
|
Универсальные функции обычно и становятся узкими местами. Не лучше ли подумать об этом сразу, чем возвращаться потом
|
нет, потому что заранее неизвестно, где будет узкое место. И вместо оптимизации всего кода, нужно оптимизировать конкретные места. А вообще, как сказал один чувак "если ты привык к такому стилю и можешь при этом эффективно заниматься проектом, то отлично. Пока кому-то другому не прийдется его отлаживать". Т.е. плюс в производительности (а это еще надо доказать на реальном проекте, мне вот так сходу не очевидно), но минус в сложностях поддержки проекта
Цитата:
|
А чем плох лишний уровень вложенности? Ты же за читаемость.
|
тем что он лишний и это как раз про читабельность
Цитата:
|
Из-за одного такого случая вряд ли что-то изменится. Но если весь код писать так, то меняется, и очень даже заметно
|
это все теория, нужен реальный (т.е. не теоретический) проект/страничка, выполненные, например, мной и тобой, на котором можно было бы сравнить производительность. Или может у тебя есть результаты подобных тестов, или статьи известных авторов на тему
Цитата:
|
Я вот только что был на qip.ru. У меня почта там. Зайди и посмотри, как тормозит почтовый интерфейс напичканный ajax-ом. При нажатии на ссылку запускающую javascript аж флеш-банеры подвисают. А теперь зайди на gmail
|
1) это ничего не говорит про экономию на операторах, это говорит только о том, что gmail сделан лучше, а в чем именно причина - неизвестно 2) это довольно серьезные сервисы (для большинства сайтов не думаю, что ты заметишь свои оптимизации, разве что отдельные в отдельных местах) и для таких проектов вряд ли оправдано использование популярных фреймворков
|
|
08.04.2009, 21:19
|
|
Рассеянный профессор
|
|
Регистрация: 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-е.
|
|
08.04.2009, 22:21
|
|
|
|
Регистрация: 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
|
|
08.04.2009, 23:33
|
...
|
|
Регистрация: 09.03.2008
Сообщений: 216
|
|
if (div.firstChild && div.innerHTML != noda.nodeValue) {
Бог с ней с читабельностью, а зачем это вообще нужно?
|
|
09.04.2009, 03:55
|
|
|
|
Регистрация: 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: чтобы не выполнять лишних действий, когда текущий узел останется таким же каким и был
|
|
09.04.2009, 07:03
|
|
Рассеянный профессор
|
|
Регистрация: 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.
|
|
09.04.2009, 08:29
|
...
|
|
Регистрация: 09.03.2008
Сообщений: 216
|
|
Сообщение от Riim
|
Мне кажется, что любой хороший программист должен стараться избавлять логику программы от лишних действий.
|
Поэтому для каждой! ноды вы создаёте элемент и так далее. Я задал выше вопрос, неужто никто не видит, что до разговора о спичках, нужно ошибки логики устранить...
|
|
09.04.2009, 08:38
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Цитата:
|
поэтому для каждой! ноды вы создаёте элемент и так далее. Я задал выше вопрос, неужто никто не видит, что до разговора о спичках, нужно ошибки логики устранить...
|
то, что можно один раз создавать div и DocumentFragment? Да (собственно, идея Dmitry A. Soshnikov) И это скорее оптимизация, чем ошибка логики
Но речь не о том. Дальше что? Исправили. Нужно дальше оптимизировать?
p.s. Riim, авторитеность jQuery сомнительна - Сторонние библиотеки - быть или не быть?
|
|
09.04.2009, 08:40
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Сообщение от Zeroglif
|
что до разговора о спичках, нужно ошибки логики устранить
|
Похоже вы сами еще не до конца разобрались в логике кода.
Если видите ошибки, приводите свой вариант.
Сообщение от Zeroglif
|
Поэтому для каждой! ноды вы создаёте элемент и так далее
|
Можно и без этого обойтись. Я спорю на тему "как оптимизировать код" на примере window.onload, но это плохой пример т. к. это одноразовый код. Я уже писал что мне все равно как он оптимизирован. Я просто взял несколько моментов из него как примеры.
Сообщение от Zeroglif
|
Я задал выше вопрос, неужто никто не видит
|
x-yuri вам ответил на него. В постах выше я 2 раза пояснял эту строку. Читайте внимательней.
|
|
09.04.2009, 08:43
|
|
Рассеянный профессор
|
|
Регистрация: 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 получше заполните
|
|
|
|