jQuery.my 1.2.0
Отрелизил сабж, релиз больше про рефакторинг/оптимизацию. Проковырялся неделю вечерами с профайлером, открыл много нового про GC и скорость регэкспов. Вот примерчик особенно злодейский:
Попутно напишу вот про виджет с заглавной, оч хорошо на нём видно и что такое $.my, и что я там оптимизировал. Пример, собсно, по клику на картинку.
В примере 100 строк кода, 2Кб, это с HTML-ем уже. Эти 2 Кб грузят внешние данные и делают из них master/detail.
Особая фишка – в левой колонке позиции таскабельны. И номера обновляются по мере перетаскивания, причём если справа открыта карточка и тыкнуто в поле ввода, то фокус не теряется.
Ну и если справа начать имя править, слева оно немедленно рефлектится. Причём можно даже начать тащить айтем слева и одновременно печатать справа )
Кто делал что-нибудь похожее хоть раз в жизни, знает, что 100 строк кода на такое – это вообще наглухо магия.
Инициализация этого виджета с 280 строками данных (каждая из которых – тоже форма) занимает примерно 300мс. По 1мс на форму. Флеймчарты до и после оптимизаций:
В самом деле 1мс – это чрезвычайно дохрена. Мы на каждую строку слева инциализируем по сути маленькое приложение, и это дорого. Увы, такой подход можно наоптимизировать ещё примерно только раза в 2 и будет потолок.
Но у меня есть план Б.
В jQuery.my 2.0 будет другой (точнее, ещё один) алгоритм. Во-первых, просто сам старт одинаковых форм станет быстрее, потому что полуфабрикат формы будет кэшироваться. А во-вторых, рендерить я их буду чанками.
Подход с чанками у меня уже 3 года как реализован для длинных списков отдельным плагином и в бою обкатан, надо только вкрутить. Это уже в 2016 будет.
Завтра-послезавтра days off.
no subject
no subject
Имеет ли смысл регексп вообще или лучше строить парсер?
no subject
Это кста не в парсере, а в сериализаторе, внутри $.my не используется – сервисная функция для удобства.
no subject
no subject
У второго – в наихудшем случае квадратичная сложность, у первого – линейная.
Иллюстрация: делаем строку из 1К символов без }, приписывам к ней в конце }x. Засекаем время на /[^}]+$/. Делаем то же самое, но 2К символов. Время увеличится в 4 раза.
Чтобы понять, почему так, посмотри, какие автоматы строятся на эти регэкспы http://hackingoff.com/compilers/regular-expression-to-nfa-dfa
no subject
no subject
Раз данные идут в одну сторону и мы не ожидаем обновления элементов списка изнутри списка, мы можем выводить элементы чанками.
Тем не менее, это всё не снимает лага на отрисовку, а он может быть существенный и непредсказуемый (у меня есть свежайший пример, где новый Хром проигрывает Файерфоксу в 60+ раз).
Lazy init – это хорошая идея, и она у меня есть в планчике – но немного не так, как ты пишешь. По такой схеме, как предлагаешь ты, непонятно, откуда в контроле возьмётся первоначальное значение. Чтобы оно там взялось, его надо туда записать. Чтобы его туда записать, надо подобрать к контролу подходящий «драйвер». Чтобы его подобрать – контрол надо проинициализировать.
В общем, всё сложно )
no subject
no subject
Эммм, а как быть с тем, что в контроле значение должно быть _перед_ тем как юзер кликнул? ))
no subject
Могу лекцию по скайпу провести, с расшариванием экрана и живыми примерами. Прикинул, это примерно на час.
no subject