Pull to refresh

Comments 12

Поэтому в нашем инструментарии есть метод для подобных целей

Героически создать себе трудности, имитируя иммутабельность там, где её нет, и потом героически их преодолевать. Зачем, чтобы обойти кривость Object.observe?
Основные назначения неизменяемости:

  • Дать компилятору больше простора для оптимизаций.
  • Упростить жизнь разным инструментам для статического анализа кода.
  • Упростить отслеживание изменений в структурах данных.

В данном случае, в Web/JavaScript, неизменяемость решает задачу облегчения рендеринга изменений в дереве пресдтавления. (Разновидность пункта три).
А еще неизменяемость данных позволяет избежать многих сайд-эффектов в функциях.
А можно поподробнее про компилятор, в чем простор?
1) Возможность вместо доступа к переменной подставить константу в выражения. И тут же провести оптимизацию свёрткой.
2) Отсутствует необходимость в синхронизации. Если переменная read-only, то можно её безопасно читать из разных потоков минуя блокировки.
Наверное, есть еще какие-то теоретические возможности это оптимизировать, но применимо ли это к тому же V8. Поток исполнения один, синхронизировать между потоками не нужно. Насчет константы тоже не факт.
Как это один? JS в браузерах разве не асинхронный?
Асинхронный и многопоточный — это не одно и тоже.
По умолчанию есть только один поток, которые асинхронно обслуживает очередь сообщений.
В браузере для многопоточности есть WebWorkers, но единственное возможное общение между потоками осуществляется через отправку строк или сериализованного в строку JSON-а, к одним и тем же переменным из разных воркеров обратиться нельзя.
Ну вот, например. Говорят, что запросы к ОЗУ можно снизить на 33-99%.

Immutability specification and its applications

onlinelibrary.wiley.com/doi/10.1002/cpe.853/pdf

ABSTRACT A location is said to be immutable if its value and the values of selected locations reachable from it are guaranteed to remain unchanged during a specified time interval. We introduce a framework for immutability specification, and discuss its application to code optimization. Compared with a final declaration, an immutability assertion in our framework can express a richer set of immutability properties along three dimensions—lifetime, reachability and context. We present a framework for processing and verifying immutability annotations in Java, as well as extending optimizations so as to exploit immutability information. Preliminary experimental results show that a significant number (61%) of read accesses could potentially be classified as immutable in our framework. Further, use of immutability information yields substantial reductions (33–99%) in the number of dynamic read accesses, and also measurable speedups in the range of 5–10% for certain benchmark programs.

следовательно, предложенный механизм отслеживания мутаций не годится даже для тривиального случая применения
Object.observe всего лишь «кирпичик», при необходимости можно рекурсивно отслеживать все «дерево».
А что если у меня данные в виде графа с циклами, а не дерева?
На практике, во множестве случаев применение неизменяемых данных увеличит общую производительность вашего приложения, даже если определённые операции станут более затратными в отдельности.

Как частенько договаривал неизвестный Andre_487 за известным Станиславским: не верю! Есть ли бенчмарки конкретных реализаций на JS?

Можно понять, как иммутабельность и чистые функции делают быстрее программы на языках, где это ядерная концепция, позволяющая оптимизировать и разводить по потокам при компиляции, но в JS ведь это отсутствует и оптимизации в современных машинах рассчитаны совсем не на подобные паттерны.
Sign up to leave a comment.

Articles