Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Простой сортировщик HTML таблиц (https://javascript.ru/forum/project/21463-prostojj-sortirovshhik-html-tablic.html)

Kolyaj 13.09.2011 11:53

Цитата:

Сообщение от NoResponse
если цель сократить код, то я бы "избавился" от всех... или почти всех var

Интересно вы код сократили, на 1 байт больше стало. Если одновременно с объявлением переменной идёт её инициализация, то с var короче будет.

with-love-from-siberia 14.09.2011 20:46

Исправления предлагаю. Замените строку
Код:

for (var e in ts) {
на
Код:

for(var e = 0; e < ts.length; e++) {

stopkran 15.09.2011 05:59

Цитата:

Сообщение от with-love-from-siberia
Исправления предлагаю

А что мне за это будет? Вы предлагаете удлинить код - ради чего? в чём выгода? :-) Вот если бы вы предложили в строке 07 заменить фрагмент "ts = (t && t.className) ? [t] ..." на более простой "ts = (t) ? [t] ...", я бы ещё подумал.

Octane 15.09.2011 08:33

Для Array часто добавляют реализацию стандартных методов в прототип для старых браузеров, поэтому el может оказаться, например, "forEach" или "indexOf"… можно конечно добавить проверку hasOwnProperty, но лучше перебирать по индексам элементов.

with-love-from-siberia 15.09.2011 08:45

Цитата:

Сообщение от Octane
Для Array часто добавляют реализацию стандартных методов

На самом деле getElementsByTagName возвращает не массив а коллекцию. for in в данном случае занимается перебором всех свойств коллекции - 0, ..., length, item, namedItem.

Цитата:

Сообщение от stopkran
А что мне за это будет?

Ничего плохого. Лишние проходы цикла - сомнительная экономия в ущерб производительности. Хотя их всего три, но ведь их может быть и больше. Вдруг Вы еще где-то съэкономили на производительности?

stopkran 15.09.2011 10:22

Согласен, for in выглядит несколько некошерным, таким "неформалом". Но, к сожалению, я это знал и раньше, и прошёл много всяких граблей на эту тему, использовать теперь не боюсь. Оставлю пока как "каприз художника".

О, я много где сэкономил на производительности! :-) Но вы всё равно не найдёте. Да я и сам сейчас не вспомню всего. Но можно ведь производительность просто измерить. В первой версии я сэкономил на коде (измерителя нет). Но вот в следующей (Simple Table Sorter v0.03) можно посмотреть скорость:

http://ir2.ru/sort0.03/table1000.htm

Можно даже сравнить по скорости с некоторыми другими сортировщиками (желательно в IE):

http://ir2.ru/sorters/fd/
http://ir2.ru/sorters/la/
http://ir2.ru/sorters/standardista/

Это, конечно, очень приблизительно (измеритель прикручивал к чужому коду, мог не всё учесть и неправильно назвать какие-то моменты). Ну, плюс я добрый - добавил в standardista небольшой хак, без которого в IE сортировка работала бы десятки секунд.

Octane 15.09.2011 11:33

Кстати заметил, что последнее время, с появлением Object.keys, у меня в коде вообще исчезли for-in, теперь пишу:
var keys = Object.keys(obj), i = keys.length;
while (i--) {
    obj[keys[i]]…
}

в браузерах поддерживающих Object.keys разница в скорости с вариантом:
for (key in obj) {
    if (obj.hasOwnProperty(key)) {
        obj[key]…
    }
}

несущественна.

Kolyaj 15.09.2011 12:27

Цитата:

Сообщение от Octane
с, появлением Object.keys, у меня в коде вообще исчезли for-in

А почему while не исчезли?
Object.keys(obj).forEach(function(key) {
   // ...
});

Octane 15.09.2011 12:36

Как-то расточительно на каждую итерацию выполнять функцию, когда можно этого не делать

Kolyaj 15.09.2011 12:40

Да перестань, на фоне любой операции внутри функции вызов самой функции будет незначительным. Выигрыш у тебя будет только если ты проверяешь на скорость различные виды ничего не делающих циклов.
А вот создающийся скоп внутри функции реально полезен.


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