Мы создаем высокопроизводительное приложение, которое должно использовать неизменяемое состояние для объектов, которые меняются очень часто (тысячи раз в секунду).
Первоначально мы создавали решение на основе Proxy; Прокси будет обернуть необработанный базовый объект, и у него также будет объект с именем modified
, который каждый раз, когда вызывается Прокси set
, мы записываем в объект modified
, а не в необработанный базовый объект.
* Затем 1007 *
get
сначала проверит, содержит ли
modified
данный ключ, и если да, то вернет его; в противном случае он возвращал значение из базового объекта.
Это работало хорошо, но было в два раза медленнее, чем прямой доступ к свойству простого старого объекта (почти точно, последовательно). Это было связано с проверкой if (modified[key] === undefined)
.
Я понимаю, что Immer. js использует прокси. Мой вопрос: когда вы продолжаете создавать новое состояние из предыдущего состояния с помощью Immer, это просто оборачивает предыдущий прокси новым? Что означает, что если вы сделали 1000 «мутаций» для объекта, то для вызова get
потенциально может потребоваться рекурсивный вызов get
, пока он не достигнет первого базового объекта?
И если это так, есть ли способ существенно "сплющить" дерево прокси (по сути, заплатить "клон"), чтобы уменьшить глубину вложенных прокси?