1

https://github.com/joyent/node/blob/master/lib/freelist.js

destroy メソッドを作るのは非常に危険です。これが心配な場合は、require('freelist') を使用し、使用後にメモリを再利用することをお勧めします。これは、net.js で行っていることです。

たとえば、https://github.com/joyent/node/blob/master/lib/http.jsで使用されていますが、まだ完全には取得していません。このモジュールの使用方法の例は素晴らしいでしょう。

4

1 に答える 1

7

頻繁に作成および破棄されるオブジェクトの再利用を管理するための非常に簡単な方法です。フリーリストは、現在使用されていないオブジェクトが利用できない場合にのみ新しいオブジェクトを作成し、ガベージ コレクションなどを待たずにメモリ フットプリントを削減します。これを使用するには、次の 3 つの簡単な手順が必要です。

ベクトル用の新しいフリーリストの作成 (再利用したい架空のオブジェクト タイプ):

// Some type of object I want to be able to reuse
var Vector = require('./Vector');
// The freelist itself
var FreeList = require('freelist').FreeList;

// Arguments are (freelistName, maxSize, constructorForNewObjects)
var vectorsList = new FreeList('vectors', 1000, function() {
  // quick way to use constructor with arguments object
  return Vector.apply(Object.create(Vector.prototype), arguments);
});

フリーリストから新しいベクトルを取得する:

var vector = vectorsList.alloc(/* optional arguments for the Vector constructor /*);

不要になったベクターを解放する:

vectorsList.free(vector);

それでおしまい。

注意すべき非常に重要な点の 1 つ: alloc 呼び出しからの引数をベクトル コンストラクターに渡すように上で記述しましたが、これは、リストに使用可能な空きベクトルがない場合にのみ発生します。それ以外の場合は、最初に使用可能なベクトルを取得するだけで、構築時に持っていたパラメーターを使用して構築されたままになります。

実際にすべてのオブジェクトをきれいに初期化したい場合は、おそらくオブジェクトの初期化をコンストラクターに入れるのではなく、フリーリストからオブジェクトを取得した後に常に呼び出す init 関数に入れる必要があります。

もちろん、これはおそらく、初期化のためにコンストラクターを再度呼び出すという巧妙なハッキングを使用して、フリーリストによって実行できます。

于 2012-12-04T14:13:05.500 に答える