gpt4 book ai didi

javascript - 需要 WeakMap (a, b) -> c

转载 作者:行者123 更新时间:2023-11-30 12:09:32 25 4
gpt4 key购买 nike

我有一个 memoized fn,其中 fn 由两个输入引用内存:

let NewRefCursor = memoized(
(deref, swap) => refToHash(deref) + refToHash(swap), // memoizer identity fn
(deref, swap) => new RefCursor(deref, swap)); // the function we are memoizing

我需要的行为是 NewRefCursor(a, b) === NewRefCursor(a, b)。当 ab 被垃圾回收时,游标也应该被垃圾回收。

refToHash是另一个使用 ES6 WeakMap 的内存函数这样看到的引用仍然允许 GC。

NewRefCursor 更难以内存,因为它使用两个参数来确定缓存命中,因此与 WeakMap 不兼容,因此将阻止任何可见的引用GC了。我对任何形式的欺骗持开放态度,将私有(private)字段附加到输入对象、概率数据结构。这个泄漏需要解决。到目前为止,我唯一的解决方案是向 memoize 添加一个限制缓存大小的参数,并在每个应用程序的基础上调整该参数。恶心。

最佳答案

如果你创建一个两级弱映射(在弱映射上存储弱映射),每当第一级上的对象被 gced 时,你将失去整个第二级(当 a 被 gced 时,你将失去 b)。如果 b 是 gced,你仍然会有一个 a 的 weakmap,它只会在有另一对(a,某物)时存在.不是最好的实现,但我认为它就足够了:

function BiWeakMap() {
this._map = new WeakMap();
}

BiWeakMap.prototype.set = function(key1, key2, value) {

if (!this._map.has(key1)) {
this._map.set(key1, new WeakMap());
}

this._map.get(key1).set(key2, value);

return this;

};

BiWeakMap.prototype.has = function(key1, key2) {

return this._map.has(key1) && this._map.get(key1).has(key2);

};

BiWeakMap.prototype.get = function(key1, key2) {

return this._map.get(key1) && this._map.get(key1).get(key2);

};

这个概念可以扩展到 n 级解决方案。这是否解决了您的问题,还是我遗漏了什么?

关于javascript - 需要 WeakMap (a, b) -> c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34202895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com