Вход

Просмотр полной версии : Скорость Выбоки jQuery


PeaceCoder
07.01.2010, 20:12
Вот тут написал свой скрипт выборки подобный jQuery
Кто точно знает в сотых мс сколько занимает jQuery?
У меня вышло около 0.35мс на выборку. #ID вообще 0.05мс занимает. остальное повышение занимает длина выборки (точнее от длины выборки время фактически не зависит) и количество элементов в выборке.

Octane
07.01.2010, 20:41
Выборку чего, каким CSS-селектором? Да и о каких точных результатах может идти речь, если у всех разная производительность компьютеров и браузеров?

http://slickspeed.googlecode.com/

PeaceCoder
07.01.2010, 21:19
ну вот пример
http://lusever.ru/css-selectors/webo.in/
показывает 0мс 1мс и т.п. нет точности до тысячных.
СSS селектор был "B,#123 A#123,DIV,.test" среди около 100 элементов при повторении 10000 раз.

Octane
07.01.2010, 21:24
Для сравнения системы на базе Intel Atom Z520 (http://img694.imageshack.us/img694/9049/yassjavascript.png) и Intel Core i7 720QM (http://img85.imageshack.us/img85/5875/yassjavascript126288725.png) в Firefox 3.5.7.
http://yass.webo.in/slickspeed/?jQuery_1-3-2

PeaceCoder
07.01.2010, 21:28
#title 3мсмде далеко пойдем. это че за прикол?

Octane
07.01.2010, 21:35
Там просто по много раз запускается один и тот же тест for (var i = 99; i; i--) {
$(selector);
}
чтобы не было, как у lusever, когда в современных браузерах только результаты 1 и 0 мс.

PeaceCoder
07.01.2010, 21:47
Там просто по много раз запускается один и тот же тест
дык я так и тестировал выше указанный селектор 10000 раз. в итоге #ID выдает 0.05мс а указанный 0.35-0.37мс. это все меньше 1мс.

Michael83
08.01.2010, 13:34
дык я так и тестировал выше указанный селектор 10000 раз. в итоге #ID выдает 0.05мс а указанный 0.35-0.37мс. это все меньше 1мс.

А можно задать возможно глупый вопрос, как вы засекли время с точностью меньше мс в javascript? На сколько знаю в нем только с точностью до мс время узнать можно

PeaceCoder
09.01.2010, 23:33
А можно задать возможно глупый вопрос, как вы засекли время с точностью меньше мс в javascript? На сколько знаю в нем только с точностью до мс время узнать можно
общее время на количество повторов. получаем среднее время одного запроса в данном случае.
любая команда в js на моей машине выполняется в 0.004мс.

Michael83
10.01.2010, 03:40
получается у jQuery выборка по #ID занимает 3 мс / 100 итераций = 0.03 мс а у вас 0.05 :) пока jQuery выигрывает.

П.С. У меня кстати тоже была идея попробовать свою выборку реализовать так ради исследования и баловства ))

PeaceCoder
10.01.2010, 12:35
получается у jQuery выборка по #ID занимает 3 мс / 100 итераций = 0.03 мс а у вас 0.05 пока jQuery выигрывает.
Я еще до конца не оптимизировал. + Вы сравниваете мою машину и вашу. И еще не известно в каком браузере. На моей машине #ID с jQuery ~ равны. И в данном случае я планирую сделать такие выборки которые jQuery не по зубам. Или по зубам но они будут долгими. Когда реализую, отпишу возможности время выполнения и ~ размер кода

Michael83
11.01.2010, 02:26
прикольно, буду ждать с интересном :)

PeaceCoder
13.01.2010, 19:15
Скрипт еще в разработке но могу уже привести некоторые результаты

вот такой селектор

TABLE#`child` >(:2,4:6,8:) (((DIV:#(:-10,-4:-2,-0) ~-1:2)(B,A({title!=`Гыгы`i},[height='100px'])),U){title=`^До\`бро`i}) +2, SPAN.!`window`i <1:4 A


раскладывается на 31 комбинацию селекторов за:
0.0023мс в Chrome,
0.0063мс в MZ,
0.01мс Opera,
0.9мс в Safari
5-6мс в IE8

Селектор составлен хатично для показа максимума. Планируется ввести выборку по регулярке(`JSRegExp`[igm]), по атрибутам, свойствам и значениям стилей. Также в командах >,+, и новой задуманной мной < есть уровни вложенности проверок. Например, одна из возможностей, "TABLE >3:6 A" будет искать все A которые находятся в TABLE и уровень родителя TABLE не ближе 3 и не дальше 6. Позже распишу подробнее.

Octane
13.01.2010, 19:31
"TABLE >3:6 A" будет искать все A которые находятся в TABLE и уровень родителя TABLE не ближе 3 и не дальше 6.только кто, кроме тебя, захочет разбираться в каком-то новом хитром синтаксисе селекторов, когда стандартизированных CSS и XPath больше чем достаточно? :)

PeaceCoder
13.01.2010, 19:53
олько кто, кроме тебя, захочет разбираться в каком-то новом хитром синтаксисе селекторов
именно. он не нов. а расширен. все что умеет jQuery будет иметь и мой.

Kolyaj
13.01.2010, 21:58
PeaceCoder,
а зачем такие селекторы вообще нужны?

PeaceCoder
13.01.2010, 22:51
а зачем такие селекторы вообще нужны?
а зачем селекторы вообще нужны? если есть селекторы, значит надо их сделать на максимум
А вообще, для ускорения выборки и точности фильтра.

Kolyaj
14.01.2010, 11:58
а зачем селекторы вообще нужны?
Да я хз. Мне tagName+className без каскадов всегда хватало. А вот такие сложные так вообще не могу представить где бы понадобились.

Michael83
14.01.2010, 13:33
Да я хз. Мне tagName+className без каскадов всегда хватало. А вот такие сложные так вообще не могу представить где бы понадобились.

Полностью согласен, я для очень сложных вещей обычно использую несколько селекторов типа этого

$('#someid .clazz[attr=some]').each(function() {
var $this = $(this);
if ($this.is('...selector...') {
$this.find('...another..selector...')...
...
} else {
...
}
})


Это конечно не значит что я не знаю всех возможностей селекторов, просто частенько получается так что напишешь супер-чудо-селектор, а потом на след. неделю уже не сможешь с ходу понять и вспомнить как тут и что. :) тем более не думаю что производительность в приведенном выше коде ощутимо хуже, по сути тот же js выполняется

PeaceCoder
14.01.2010, 15:33
я для очень сложных вещей обычно использую несколько селекторов
плиз приведите пример из практики именнос с точными названиями селекторов. хочу попробовать сэмулировать "мой" запрос не прибегая к таким вот ухищрениям.
ем более не думаю что производительность в приведенном выше коде ощутимо хуже
ощутимо хуже. на порядок точно т.к. для каждого полученного элемента Вы проверяете не является ли он чемто + создаете новый обьект с новым запросом и не факт того, что будет хоть какой то результат. а если резултата нет, время между первым и запросом и обработкой "духов" потрачено впустую (все команды each)

x-yuri
14.01.2010, 19:20
PeaceCoder,
а зачем такие селекторы вообще нужны?
ну, по-моему, очевидно. Чтобы можно было сказать: "А вот мой фреймворк..."

а зачем селекторы вообще нужны? если есть селекторы, значит надо их сделать на максимум
мне это напомнило легенду о мастерах Мурамаса и Масамунэ (http://m-gluk.hiblogger.net/398523.html)

PeaceCoder
14.01.2010, 22:36
не это напомнило легенду о мастерах Мурамаса и Масамунэ
плохое сравнение. я же не делаю то что быдет хуже jQ а наоборот.
Вот еще один пример применения новой команды.
Допустим есть блок в котором хаотично расположены элементы с нужным классом. И допустим в этих элементах куча других элементов. Сколько их неизвестно. Задача: нужно, например, чтото делать с элементом нужного класса (необязательно :hover|:active изменение стилей), когда мышью водят/кликают над этим элементом при этом надо получить этот элемент и не факт что в этом спец элементе не будет такого же спец элемента. как вы будете решать такую задачу ? а выбрать надо всего 1 нужный блок причем с определенными параметрами

<div id='блок'>
хаотично расположенные элементы (много, в том числе и спец блоки с нужным классом)
<div class="нужныйБлок">
тут куча элементов и детей + тут тоже могут быть теже "нужные блоки"
</div>
...
</div>

Kolyaj
15.01.2010, 09:14
как вы будете решать такую задачу ?
Когда говорится, что селекторы не нужны, имеется в виду, что они не нужны при нормальной вёрстке. А если по-хорошему верстать, то и в самом CSS-то каскады не нужны, не то, что в JavaScript.

Я уж не говорю о том, что никаких #id-шников в CSS быть не должно, хоть это к теме и не относится, больной вопрос у меня просто :)

micscr
15.01.2010, 11:47
Я уж не говорю о том, что никаких #id-шников в CSS быть не должно, хоть это к теме и не относится, больной вопрос у меня просто :)
почему? (в смысле быть не должно)

Kolyaj
15.01.2010, 12:06
У селекторов с #id очень высокий вес и их практически невозможно перебить селектором без какого-нибудь #id. Попадаются умники, которые каскады из #id-шников делают. Теперь представь ситуацию, верстальщик понаписал правил для списков, вроде #page #content ul { list-style-type: none; }А тебе понадобилось на одной странице сделать список с буллетами. Ты не сможешь просто написать .mylist { list-style-type: circle; } Точнее сначала ты такое напишешь, потом будешь разбираться, почему не работает, потом обнаружишь, что вышестоящее правило в 20 раз сильнее, и чтобы его перебить, тебе нужно добавить в селектор еще 2 #id-шника. А если нужно сделать специфический блок, которые может находится в любом месте страницы, то всё становится ещё хуже.

micscr
15.01.2010, 12:36
Kolyaj спасибо.

PeaceCoder
15.01.2010, 18:24
Хе хе. а в jQ боооольшой баг =)))
создал документик с 1 DIV#id123
и сделал такую выборку

alert('Элемент #id1234567890 в документе '+(document.getElementById('id1234567890') ? '':'не')+'существует');
T=(new Date()).getTime();

for (i=0;i<1000;i++) $('#id1234567890 TABLE DIV B A U B A TABLE DIV *');

alert('Время выборки: '+((new Date()).getTime()-T)/1000+'ms');


Как вам такой баг? Вы еще пользуетесь jQ?

Octane
15.01.2010, 18:48
jQuery-ненавистнег

PeaceCoder
15.01.2010, 18:55
jQuery-ненавистнег
не. не ненависнег. просто оч много багов в нем. вот и сообщаю. много лишней работы делает.
Это видно по примеру. элемента нет а выборка занимает почти 1 мс в MZ. А ие там вообще загнется.
В связи с этим сейчас думаю как быстро пресечь вот такие вот баги.

Michael83
15.01.2010, 19:14
плиз приведите пример из практики именнос с точными названиями селекторов. хочу попробовать сэмулировать "мой" запрос не прибегая к таким вот ухищрениям.

вот например http://www.marimedia.ru/js/main.js
функция initTopMenu начиная со строки
$('#navigation .nav-item').each( function()
хотя пример не очень там внутри цикла кроме выборки еще и другая логика

В общем я не говорю, что вы зря этим занимаетесь, здесь в другом дело - как часто вообще люди применяют НАСТОЛЬКО сложные серекторы? нужно ли это? ведь как писали выше если нормально сверстано, то и запросы проще будут. и ваши выдуманные ужасные случаи когда там элемент затерялся среди других и его выцеплять надо чуть ли не по номеру строки в файле это такая редкость, что решать такие проблемы надо не такими же ужасными серекторами а изменением верстки.

Мне очень интересно что у вас получится.

PeaceCoder
15.01.2010, 19:46
Мне очень интересно что у вас получится.
то что уже получается я уже привел результаты. кстати баг с "пустышками" уже пресек.

tenshi
16.01.2010, 15:39
я вообще все выборки делаю по имени тэга и потому не заморачиваюсь по поводу скорости :-P
никаких айдишников, классов и прочей требухи.. и в стилях почти нету ни классов ни айдишиков

PeaceCoder
16.01.2010, 18:59
я вообще все выборки делаю по имени тэга и потому не заморачиваюсь по поводу скорости :-P
никаких айдишников, классов и прочей требухи.. и в стилях почти нету ни классов ни айдишиков
И сайт ввиде текста без картинок ;) Если нет классов то inline стили? это плохой знак верстки.

tenshi
16.01.2010, 19:12
http://smileg.akmedia.ru/html/lib/

PeaceCoder
16.01.2010, 19:25
все построено на <тег:спец_код>...</тег:спецкод>

tenshi
16.01.2010, 19:39
нет, на <пространство_имён:локально е_имя_тэга>

Michael83
17.01.2010, 17:57
http://smileg.akmedia.ru/html/lib/

Не знал что так можно, это везде работает? (IE6?)

Octane
17.01.2010, 18:10
Везде. Только при отключенных стилях в строку вытягивается, если вообще отказаться от стандартных блочных элементов.

Riim
17.01.2010, 23:20
<пространство_имён:локально е_имя_тэга>

В чем преимущество такой верстки?

tenshi
18.01.2010, 01:16
скорость и наглядность

PeaceCoder
24.01.2010, 22:29
Немного новостей. Бился долго против jQ и все же пока такие результаты: нестандартные запросы jQ отстает от моей реализации в 2-3 раза. Сегодня просмотрел логику работы Sizzle, на котором построен jQ - ее я не применял. Вот ща думаю и ее применить, тогда думаю раза в 4 jQ будет отставать. Занимаемый код около 100 строк (около 3000 символов)... еще не конец....

Riim
25.01.2010, 00:51
Уже быстрей, чем jass?

Kolyaj
25.01.2010, 11:47
нестандартные запросы jQ отстает от моей реализации в 2-3 раза.
А стандартные? Нестандартные-то мало кого интересуют.

PeaceCoder
25.01.2010, 12:42
А стандартные? Нестандартные-то мало кого интересуют.
А стандартные по возможности выполняет querySelectAll как и в Sizzle

tenshi
25.01.2010, 13:36
нестандартные - это какие?

PeaceCoder
25.01.2010, 13:51
нестандартные - это какие?
Псевдо :input,:checkbox и т.п. + мои расширения, например:

B < !DIV!SPAN{prop+5>=10, innerHTML=`<table>`i}
возьмет все элементы B, которые содержат элементы детей кроме DIV и SPAN, у которых свойство prop есть и выполняется условие или innerHTML проходит по регулярному выражению
#`text`i
возьмет все элементы с ID по регулярному выражению (кстати такую задачу люди здесь уже спрашивали, а она уже была в планах)

ну и т.п.

e1f
25.01.2010, 14:56
PeaceCoder,
а Вы можете ответить на такой вопрос -- нафига?
Что это дает? Вы действительно считаете, что в прикладных решениях нужны подобные говновыборки?

PeaceCoder
25.01.2010, 15:03
а Вы можете ответить на такой вопрос -- нафига?
Что это дает? Вы действительно считаете, что в прикладных решениях нужны подобные говновыборки?
если делаю, значит я уже с таким сталкивался, и как можно видеть не только я один. Вы может этого не замечали, но может тоже с таким сталкивались но в силу того что JQ такого не позволяет обходили другими способами. + это расширение и на скорость никак не влияет.
А кстати запрос
B < !DIV!SPAN{prop+5>=10, innerHTML=`<table>`i}
Аналогичен jQ
B:not(а дальше хз как задать запрос аналогичный моему)

e1f
25.01.2010, 15:14
А Вам не кажется, что если Вы с таким сталкивались, то это может означать криво спроектированный шаблон?

PeaceCoder
25.01.2010, 15:22
А Вам не кажется, что если Вы с таким сталкивались, то это может означать криво спроектированный шаблон?
нет это значит высокая гибкость проекта.

e1f
25.01.2010, 15:57
И в чем будет заключатся гибкость проекта? Мы изменили шаблон -- теперь нужно переписать Ваши заумные селекторы, вместо того, чтобы, оставив ключевые классы, ничего не трогать в javascript-части. Гибко, однако.

x-yuri
26.01.2010, 06:55
если делаю, значит я уже с таким сталкивался, и как можно видеть не только я один
и кто же этот второй?

tenshi
26.01.2010, 09:31
> кстати такую задачу люди здесь уже спрашивали
и почему всех так интересует, как прострелить себе ногу? х))

tenshi
26.01.2010, 09:45
как мне выбрать все элементы b, u или i, но не span имеющие идентификаторы вида 'email1234', где число после email меньше 1024, такие, что вложенные в них span-ы c классами 'current' и 'original' имеют внутри себя валидные email адреса ( при этом каждый из спанов может быть и пустым или вообще отсутствовать, но не оба одновременно )?

PeaceCoder
26.01.2010, 13:50
пока раскрытие скобок не сделал (много времени занимает), но с ними выглядело бы так:

(B,U,I)#`email([0-9]{1,3}|10[01][0-9]|102[0-3])`(:empty, < SPAN.curent.original{innerHTML=`регулярка валидности Email|`i})

tenshi
26.01.2010, 17:57
> SPAN.curent.original
это должны быть разные спаны, и присутствовать должен хотябы один из них (с валидным мылом разумеется)

tenshi
26.01.2010, 17:58
> :empty
а вот таких выбирать не надо

PeaceCoder
26.01.2010, 18:21
(B,U,I)#`email([0-9]{1,3}|10[01][0-9]|102[0-3])` < SPAN(.curent.!original,.original.!curent){innerHTM L=`регулярка валидности Email|`i}

Вот ток задача еще сделать быстрый разбор раскрытия скобок за 1 проход...

tenshi
27.01.2010, 01:32
опять не то, твой запрос неправильно отработает, если в одном спане будет валидный емыл, а в другом - невалидный :-Р

PeaceCoder
27.01.2010, 01:46
кто те ктакое сказал? условие поставлено что бы брать только валидные. Если ты имеешь ввиду в конце | то это можно убрать.

tenshi
27.01.2010, 03:10
он выбирает те элементы в которых есть валидные элементы, но он не гарантирует, что они валидны все.

PeaceCoder
27.01.2010, 14:41
но он не гарантирует, что они валидны все.
эт ты так думаешь

tenshi
27.01.2010, 15:30
то есть твой предикат действует на множество с квантификатором "и"? а если мне нужно "или"?

PeaceCoder
27.01.2010, 15:31
, = ИЛИ
пробел = И
Это везде что внутри скобок что вне скобок

x-yuri
05.02.2010, 16:58
слушай, я придумал, эти селекторы должны называться регулярными :)

e1f
05.02.2010, 17:22
PCEngine == P(eace)C(oder)Engine :)
Он все рассчитал :)

PeaceCoder
05.02.2010, 17:40
слушай, я придумал, эти селекторы должны называться регулярными
хорошая идея.
PCEngine == P(eace)C(oder)Engine
Тоже неплохо. Ток мой CMS называется FLECO и соотв функция ядро - F$