Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #41 (permalink)  
Старый 19.06.2014, 13:07
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Выпустил апдейт 5.0.4. Значительно увеличена скорость работы pop / shift для простых объектов.
__________________
kobezzza
code monkey
Ответить с цитированием
  #42 (permalink)  
Старый 19.06.2014, 18:41
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Выпустил апдейт 5.0.5.

Реализовано кеширование сгенерированных циклов в файле для node.js.
Реализована оптимизация "холостых" итераций, т.е. без передачи параметров в callback.

$C({a: 1, b: 2}).forEach(function () {
    ...
});

$C({a: 1, b: 2}).forEach(function (el) {
    ...
});


Первый вариант теперь работает почти в 3 раза быстрее.
__________________
kobezzza
code monkey
Ответить с цитированием
  #43 (permalink)  
Старый 19.06.2014, 20:28
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от kobezzza Посмотреть сообщение
Выпустил апдейт 5.0.5.

Реализовано кеширование сгенерированных циклов в файле для node.js.
Реализована оптимизация "холостых" итераций, т.е. без передачи параметров в callback.

$C({a: 1, b: 2}).forEach(function () {
    ...
});

$C({a: 1, b: 2}).forEach(function (el) {
    ...
});


Первый вариант теперь работает почти в 3 раза быстрее.
почему работает эта оптимизация???
Ответить с цитированием
  #44 (permalink)  
Старый 19.06.2014, 20:37
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от melky Посмотреть сообщение
почему работает эта оптимизация???
Потому что el вычисляемый параметр, и в некоторых случаях довольно затратный (получение из цепочки прототипов и т.д.). На самом деле я просто добавил условие, что неиспользуемые параметры не только не передаются в callback, но и не вычисляются и это дало профит.

Конечно это оптимизация нужна очень редко, но все равно
__________________
kobezzza
code monkey
Ответить с цитированием
  #45 (permalink)  
Старый 30.06.2014, 12:35
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сегодня приснился ещё один оптимизационный трюк, думаю смогу ускорить работы некоторых операций ещё процентов на 5-10
__________________
kobezzza
code monkey
Ответить с цитированием
  #46 (permalink)  
Старый 30.06.2014, 14:58
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

не сравнивал скорость работы $C с fast.js?
Ответить с цитированием
  #47 (permalink)  
Старый 30.06.2014, 15:13
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от melky Посмотреть сообщение
не сравнивал скорость работы $C с fast.js?
Нет, но как раз собирался, но почти уверен, что Collection порвёт всех как тузик грелку

А если сравнивать с точки зрения алгоритмической сложности, тот тут Collection быстрее всех аналогов в N раз (где N количество операций), например:

filter1().filter2().map().slice(0, 10) // 4 операции + на slice потенциальный огромный оверхед

$C(...).map(calback, {filter: 'filter1 && filter2', from: 0, count: 10}) // никаких оверхедов, т.к. всё делается в один проход и операция сбросится после достижения count: 10


UPD: в релизе 5.1 (надеюсь сегодня сделаю) реализовал бешеную оптимизацию для обхода Map / Set. При сравнении с нативным for of разница примерно в 40 раз, а при обходе с reverse: true, то в N раз (где N - количество элементов в коллекции).

UPD:UPD:
Глянул код fast.js, результат мне уже известен Вообще все классические оптимизации, которые применяются в underscore, lodash, fast.js и т.д. по природе своей ущербны, т.к. они их делают в живом цикле и поэтому они всегда будут проигрывать Collection или нативным циклам. А вот Collection основан на хитрой кодогенерации, т.е. полученный цикл лишён не нужных для каждого конкретного случая оптимизаций и проверок и поэтому работает с максимальной эффективностью.
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 30.06.2014 в 15:22.
Ответить с цитированием
  #48 (permalink)  
Старый 30.06.2014, 20:08
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Выпустил апдейт v5.1.0.

1) Исправлена критическая бага в методе remove;
2) Очень сильно увеличена производительность обхода Map / Set коллекций;
3) Улучшен модуль инлайнинга, что дало в некоторых случаях дополнительный профит;
4) Добавлена новая сборка Collection.core, которая включает в себя только 2 основных метода: forEach и extend и весит примерно 8кб в gzip;
5) Добавлен параметр chain для некоторых итерационных методов, который позволяет делать цепочки вызовов:

$C(...).map(..., {chain: true}).get()
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 30.06.2014 в 20:21.
Ответить с цитированием
  #49 (permalink)  
Старый 20.07.2014, 20:49
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

В планируемом обновление 5.2.0 добавлю новый контекстный метод yield (будет требоваться поддержка генераторов).

var result = $C({ ...очень большой объект... }).map(function (el, key, data, i) {
    this.$.i = this.$.i || 1;

    if (i === 1e6 * this.$.i) {
        this.$.i++;
        this.yield();
    }
});

$C.onFinish(result, function (value) {
    ...
});


Т.е. метод this.yield(); прерывает выполнение операции и возвращает объект:

{
    done: true / false,
    result: ...
}


Таким образом дробление сложной операции будет осуществляться очень просто. Работу над обновлением планирую начать сразу же, после окончания работа над Snakeskin 4.
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 21.07.2014 в 00:56.
Ответить с цитированием
  #50 (permalink)  
Старый 21.07.2014, 00:56
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Также решил добавить 2 новых параметра для всех итеративных методов: iterations и onFinish

$C({ ...очень большой объект... }).forEach(function () { ... }, {
    iterations: 1e5,
    onFinish: function (value) { ... }
});


Т.е. каждые 1e5 итераций будет делаться прерывание и дальнейшая работа продолжиться на следующем итерационном цикле, а onFinish будет вызван, когда операция закончиться.
__________________
kobezzza
code monkey
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закрытие и открытие дива по клику OLDBOY Общие вопросы Javascript 30 28.09.2016 19:41
Collection v4 kobezzza Ваши сайты и скрипты 50 13.02.2014 20:10
как обновлять collection каждые 5 секунд sergey_magic Backbone.js 1 29.07.2013 14:31
Collection – фреймворк для управления данными kobezzza Ваши сайты и скрипты 155 10.05.2013 08:59
Удаление всех options в select Ceргей Элементы интерфейса 9 28.11.2012 08:36