2018年3月11日日曜日

JavaScriptに値の弱参照マップがほしい

言いたいことは全てタイトルに書いてしまいましたが、一応説明しておきましょうか。

JavaScriptのWeakMap

詳しくはドキュメントを参照してもらうとして、簡単に説明すると

  • WeakMapが行うのはキーへの弱参照 
  • キーへの参照がなくなったときにマップのエントリがGCの対象になる
つまりこういうこと。
const wm = new WeakMap();

function foo() {
    const key = {};
    const value = {};
    wm.set(key, value);
    // この関数が終わったらkeyへの参照がなくなるので、このエントリがGC対象となる
}

foo();
そもそも弱参照って何かって?ホラあれだ、えーと、参照カウントを増やさない参照のことよ。詳しくは各自しらべてね。

ほしいもの

で、ほしいのは、キーへの弱参照ではなく値への弱参照を行うマップ。
つまり、keyではなくvalueへの参照がなくなったらエントリがGC対象になるやつ。

誰も使っていなければエントリが破棄されるので、巨大なキャッシュを作るときに便利なんです。

特にWebサーバとして動くときは、1つのリクエストで使うメモリはなるべく抑えたいしね。

Pythonでは?

Pythonには、キーへの弱残照マップ(WeakMap相当)にWeakKeyDictionaryが、値への弱参照(この記事で書いてるほしいやつ)にWeakValueDictonaryがあります。

Pythonマジできるやつ。

JavaScriptでエミュレートできない?


誰か作ってないかなと思ってnpmパッケージを調べてみたら…

あったよ!

weak-value-map

どうやって実装してるんだろうと思って中を除いたらC++でコア部分を作ってた。すげー。てことはやっぱりPure JavaScriptでは実装できないのかな。

JavaScriptの言語仕様に取り込むのは難しいかもしれないけど、せめてNodeで取り込んでくれないかな… |д゚)チラッ

おもしろそう。あとで試してみよっと。

0 件のコメント:

コメントを投稿