簡體   English   中英

JavaScript中的性能內存管理

[英]Performance Memory Management in JavaScript

讓我先從問題開始,然后填寫原因/背景。

問題:是否有適用於JavaScript的內存分析工具?

問:有沒有人在JavaScript中測試性能內存管理?

我想在JavaScript中嘗試性能內存管理。 在C / C ++ / Assembly中,我能夠在一個巨型塊中分配一個內存區域,然后將我的數據結構映射到該區域。 這有幾個性能優勢,特別是對於數學繁重的應用程序。

我知道我無法分配內存並在JavaScript(或Java)中映射我自己的數據結構。 但是,我可以使用一些預定數量的對象創建堆棧/隊列/堆,例如Vector對象。 在處理數字時,我經常在任何時候只需要幾個這樣的對象,但隨着時間的推移會產生大量的數據。 通過重用舊的矢量對象,我可以避免創建/刪除時間,不必要的垃圾收集時間,以及等待垃圾收集時可能存在的大量內存占用。 我還假設它們將在內存中保持相當接近,因為它們是在同一時間創建的並且經常被訪問。

我想測試一下,但我的內存分析工具很簡短。 我嘗試過FireBug,但它沒有告訴你JavaScript引擎當前分配了多少內存。

我能夠編寫一個簡單的CPU性能測試(見下文)。 我將一個隊列與10個“Vector”對象進行比較,每次都使用new / delete。 為了確定我不只是使用空數據,我分配了Vector 6浮點屬性,三個值數組(浮點數)和一個18個字符的字符串。 每次我使用任一方法創建一個向量時,我都會將所有值設置為0.0。

結果令人鼓舞。 顯式管理方法最初速度更快,但javascript引擎有一些緩存,並且在運行測試幾次后它就趕上了。 最有趣的部分是當我嘗試在1000萬個對象上運行標准的new / delete時,FireBug崩潰了,但是對於我的隊列方法工作得很好。

如果我能找到內存分析工具,我想在不同的結構(數組,堆,隊列,堆棧)上測試它。 我還想在一個真實的應用程序上測試它,也許是一個超級簡單的光線跟蹤器(快速編寫代碼,可以測試非常大的數據集,其中有大量的數學用於很好的分析)。

是的,我在創建這個問題之前就進行了搜索。 我發現的一切都是討論JavaScript中的內存泄漏或討論GC與顯式管理。

謝謝,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();
}

chrome檢查器有一個不錯的javascript分析工具。 我試試......

我從來沒有見過這樣的工具,但實際上,javascript [幾乎]從不獨立運行; 它[幾乎]總是托管在另一個應用程序(例如您的瀏覽器)中。 與特定數據結構相關聯的內存並不重要,重要的是主機應用程序的整體內存消耗如何受腳本影響。

我建議為您的操作系統找一個通用的內存分析工具,並將其指向您的瀏覽器。 運行單個頁面並在觸發代碼之前和之后分析瀏覽器內存消耗的變化。

我剛才能想到的唯一例外是node.js ...如果您使用的是節點,那么您可以使用process.memoryUsage()

編輯: Oooo ...經過一些搜索, Chrome似乎也有一些甜蜜的工具 Michael Berkompas的+1 )。 我仍然支持我最初的陳述,看看瀏覽器進程本身的內存使用情況如何受到影響實際上更為重要,但Chrome工具的優雅性令人印象深刻。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM