Как стать автором
Обновить

Комментарии 9

Кому не сложно (например wifi под рукой) зайдите на jsperf и прогоните тесты с мобильных и с планшетов, с основных и дополнительных браузеров, очень любопытно что там творится)) jsperf.com/tick =)
Android 4.4.
Mozilla 43.0:
timeout — 3.79 worst
post message — 104
mutation observer — 292 best
promises — 181

Chrome 47.0.2526.83:
timeout — 4.34 worst
post message — 165
mutation observer — 573
promises — 783 best
Версии последние в сторе
Реализации setImmediate: сообщения, мутация или обещания, что быстрее?

Какбэ setImmediate и postMessage — task, MutationObserver и Promise — microtask, что принципиально.

Реализации task и microtask в core-js.
А в связи с тем, как дико работают Promise в браузерах только MutationObserver и остается для microtask если нужен стабильный результат.
Вот большая статья по теме: jakearchibald.com/2015/tasks-microtasks-queues-and-schedules
На тестах с 1000-ью итерациями я понял, что обещания работают в хромах и операх хорошо, грех жаловаться, а вот там, где они медленнее мутаций — грех их использовать.
Всё-таки меня в целом удивило вот что: казалось бы Promise довольно простая структура, в отличии от мутаций, но в ранних тестах в фф они давали строго схожий результат (в статье момент опущен), хотя «любили» падать если один объект слишком долго используется, от «обнулятеля» скорость просела вдвое.
Так что то, что мутации дольше обещаний ожидаемый результат, а что далеко не везде — неожиданность =)

Зато(!) основываясь на мутациях можно уже делать полифил для Promise =)
Вы смотрите с точки зрения скорости, я смотрю ещё и с точки правильности. Около недели назад достаточно глубоко вникал в тему, и оказалось что надежный порядок выполнения имеет только MutationObserver. На Promise надеяться нельзя, так как он не консистентный в кроссбраузерном смысле. В статье много подробностей и примеры. Возможно, вам это и подходит, у меня же была цель оптимизировать микрозадачи в Polymer, и ничего лучше MutationObserver пока не нашел (даже в Chrome аналогичная реализация с Promise работала почему-то немного медленнее).
Для понимания: setImmediate это метод объекта window, который должен вызвать функцию, переданную в неё, асинхронно, эдакий setTimeout(fn, 0), где 0 реально 0, а не минимум 4. Для nodejs-программистов это process.nextTick

Ничего подобного. process.nextTick и setImmediate похожи лишь тем, что вызывают переданную функцию асинхронно.

nodejs.org/api/timers.html
nodejs.org/api/process.html#process_process_nexttick_callback_arg

Упорядочено: process.nextTick, I/O активность, setImmediate, setTimeout ± setInterval
Ну и по поводу
setTimeout(fn, 0), где 0 реально 0, а не минимум 4
— это тоже не так.
setImmediate()
Calls a function immediately after the browser has completed other operations, such as events and display updates.
. То есть когда браузер обработает все события и всё отрисует. А это может быть и 0, и 4 и 4000.

developer.mozilla.org/en-US/Add-ons/Code_snippets/Timers
Аналогичнось process.nextTick и setImmediate достаточна же, чтобы человек понял о чём речь в принципе. «Эдакий» это аналогия, допущения.
Что касается таймера, так если выставить setTimeout(0,20) это так же не значит, что код выполнится через 20мс, он может выполниться и чрез секунду, если основная ветка всю секунду будет фурыкать; второй аргумент (функции setTimeout) правильнее читать, как «не раньше, чем через», а значит, если там реальный 0, то правильно будет прочитать «сразу, как это возможно».

И именно в виду всех ограничений стандарта, которые сложно так соблюсти (дождаться окончания отрисовки, обработки событий, всей шушеры) итоговая реализация не полифил на тему setImmediate, кой уже есть и работает, а совершенно иначе названный метод «tick», чья цель, как было поставлено в задаче «асинхронного выполнения переданной функции/метода как можно быстрее», кою он, вроде, выполняет)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации