3

質問から始めて、理由/背景を記入してください。

質問: JavaScript 用のメモリ プロファイリング ツールはありますか?

質問: JavaScript でパフォーマンス メモリ管理をテストした人はいますか?

JavaScript でパフォーマンス メモリ管理を試してみたいと思います。C/C++/Assembly では、メモリの領域を 1 つの巨大なブロックに割り当て、データ構造をその領域にマップすることができました。これには、特に計算量の多いアプリケーションの場合に、いくつかのパフォーマンス上の利点がありました。

私は、メモリを割り当てたり、JavaScript (または Java については Java) で独自のデータ構造をマップしたりできないことを知っています。ただし、Vector オブジェクトなど、あらかじめ決められた数のオブジェクトでスタック/キュー/ヒープを作成できます。数値を処理するとき、一度に必要なオブジェクトは数個だけですが、時間の経過とともに大量のオブジェクトが生成されることがよくあります。古いベクター オブジェクトを再利用することで、作成/削除の時間、不要なガベージ コレクションの時間、およびガベージ コレクションを待機している間の潜在的に大きなメモリ フットプリントを回避できます。また、それらは同時に作成され、頻繁にアクセスされるため、すべてメモリ内にかなり近くにとどまると仮定しています。

これをテストしたいのですが、メモリ プロファイリング ツールが不足しています。FireBug を試しましたが、JavaScript エンジンが現在割り当てているメモリ量がわかりません。

CPU パフォーマンスの簡単なテストをコーディングすることができました (以下を参照)。10個の「ベクター」オブジェクトを持つキューを、毎回新規/削除を使用する場合と比較しました。空のデータだけを使用していないことを確認するために、Vector 6 の浮動小数点プロパティ、3 つの値の配列 (floats)、および 18 文字の文字列を割り当てました。いずれかの方法を使用してベクトルを作成するたびに、すべての値を 0.0 に設定します。

結果は心強いものでした。明示的な管理方法は最初は高速でしたが、javascript エンジンにはキャッシュがあり、テストを数回実行した後に追いつきました。最も興味深い部分は、1,000 万個のオブジェクトに対して標準の新規作成/削除を実行しようとしたときに FireBug がクラッシュしたことですが、キュー メソッドでは問題なく動作しました。

メモリ プロファイリング ツールを見つけることができれば、さまざまな構造 (配列、ヒープ、キュー、スタック) でこれをテストしたいと思います。また、実際のアプリケーションでテストしたいと思います。おそらく、非常に単純なレイ トレーサーです (コーディングが迅速で、優れたプロファイリングのために多くの計算を使用して非常に大きなデータ セットをテストできます)。

はい、この質問を作成する前に検索しました。私が見つけたものはすべて、JavaScript でのメモリ リークに関する議論、または GC と Explicit Management に関する議論のいずれかでした。

ありがとう、JB

標準的な方法

function setBaseVectorValues(vector) {
    vector.x = 0.0;
    vector.y = 0.0;
    vector.z = 0.0;
    vector.theta = 0.0;
    vector.phi = 0.0;
    vector.magnitude = 0.0;
    vector.color = [0.0, 0.0, 0.0];
    vector.description = "a blank base vector";
}

function standardCreateObject() {
    var vector = new Object();
    setBaseVectorValues(vector);

    return vector;
}

function standardDeleteObject(obj) {
    delete obj;
}

function testStandardMM(count) {
    var start = new Date().getTime();
    for(i=0; i<count; i++) {
        obj = standardCreateObject();
        standardDeleteObject(obj);
    }
    var end = new Date().getTime();

    return "Time: " + (end - start)
}

管理された方法

http://code.stephenmorley.org/javascript/queues/の JavaScript キューを使用しました。

function newCreateObject() {
    var vector = allocateVector();
    setBaseVectorValues(vector);

    return vector;
}

function newDeleteObject(obj) {
    queue.enqueue(obj);
}

function newInitObjects(bufferSize) {
    queue = new Queue()
    for(i=0; i<bufferSize; i++) {
        queue.enqueue(standardCreateObject());
    }
}

function allocateVector() {
    var vector
    if(queue.isEmpty()) {
        vector = new Object();
    }else {
        vector = queue.dequeue();
    }

    return vector;
}

function testNewMM(count) {
    start = new Date().getTime();
    newInitObjects(10);
    for(i=0; i<count; i++) {
        obj = newCreateObject();
        newDeleteObject(obj);
        obj = null;
    }
    end = new Date().getTime();

    return "Time: " + (end - start) + "Vectors Available: " + queue.getLength();
}
4

2 に答える 2

3

chrome inspectorには、まともなjavascriptプロファイリングツールがあります。私はそれを試してみます...

于 2012-04-20T21:08:27.420 に答える
1

私はそのようなツールを見たことがありませんが、実際には、javascriptは[ほとんど]独立して実行されることはありません。[ほとんど]常に別のアプリケーション(ブラウザなど)内でホストされます。特定のデータ構造に関連付けられているメモリの量は実際には重要ではありません。重要なのは、ホストアプリケーションの全体的なメモリ消費がスクリプトによってどのように影響を受けるかです。

OS用の一般的なメモリプロファイリングツールを見つけて、ブラウザに向けることをお勧めします。単一のページを実行し、コードをトリガーする前後のブラウザーのメモリ消費量の変化をプロファイルします。

私が今考えることができる上記の唯一の例外はnode.jsです...ノードを使用している場合は、を使用できますprocess.memoryUsage()

編集: Oooo ...いくつか検索したところ、Chromeにもいくつかの優れたツールがあるようです。(Michael Berkompasの場合は+1)。ブラウザプロセス自体のメモリ使用量がどのように影響を受けるかを確認することが実際にはより重要であるという私の元の声明を今でも支持していますが、Chromeツールの優雅さは印象的です。

于 2012-04-20T21:09:04.097 に答える