Обновить

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

победили утечки памяти

export type EffectCb = (() => void) & {
  status: "active" | "inactive";
  children?: Set<EffectCb>;
  parent?: WeakRef<EffectCb>;
  cleanupSet?: Set<() => void>;
  component?: WeakRef<HTMLElement>;
  destroy?: () => void;
};

Слишком дорогой ценой.

1) WeakRef дороги сами по себе
2) WeakRef немного тормозят GC
3) WeakRef немного тормозят event loop

Кроме того:

дочерний добавляется в children родителя, а ссылка на родителя хранится через WeakRef

Тут children просто Set, а не WeakSet, наличие в нем ссылки на EffectCb препятствует очистки WeakRef содержащее этот же EffectCb, а значит сама упаковка в WeakRef не имеет смысла.

Куда проще и дешевле была бы реализация через back-pointer.

Тут children просто Set, а не WeakSet, наличие в нем ссылки на EffectCb препятствует очистки WeakRef содержащее этот же EffectCb, а значит сама упаковка в WeakRef не имеет смысла.

Согласен, но это и не так важно, потому что WeakRef здесь больше как подстраховка, а не основной способ борьбы с утечками.

Основная суть в том, что всё это привязывается к компонентам и удаляется вместе с ними.

1) WeakRef дороги сами по себе

2) WeakRef немного тормозят GC

3) WeakRef немного тормозят event loop

Да, но пользы значительно больше, чем незначительное влияние на производительность. И там не так много WeakRef получается, если смотреть в рамках одного компонента.

WeakRef здесь больше как подстраховка

Какой-то странный способ программировать. Вы или понимаете что код делает, или нет. Какая может быть подстраховка, если ясно что ссылку на объект держит Set, и пока он держит GC этот объект не очистит?

чем незначительное влияние на производительность

Очень даже значительное.

Какая может быть подстраховка, если ясно что ссылку на объект держит Set, и пока он держит GC этот объект не очистит?

Чистит, когда разрушается компонент. Вызывается destroy для каждого эффекта. И после разрушения компонента уже никто не держит ссылку на эти эффекты.

А WeakRef на parent больше нужен, чтобы случайно не обратиться к эффекту, который был удален (есть такие ситуации в коде)

Очень даже значительное

Наверное, стоит уточнить, что наши пользователи не заметили изменения в производительности.

Наверное, для ваших пользователей эти изменения были бы очень даже значительные, тут не буду спорить.

---------------------------------

Не пытайтесь найти там идеальное решение, его там точно нет)

Можно было бы сделать лучше?! Конечно.

Текущее решение мы посчитали наиболее подходящим для нас и наших пользователей.

Возможно, в будущем мы сделаем рефакторинг текущего решения и найдём что-то лучше.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации