javascript - JavaScript 中的性能内存管理

标签 javascript performance memory memory-management

让我从问题开始,然后填写原因/背景。

问题:有没有针对 JavaScript 的内存分析工具?

问题:是否有人已经在 J​​avaScript 中测试过性能内存管理?

我想在 JavaScript 中试验性能内存管理。在 C/C++/Assembly 中,我能够在一个巨大的 block 中分配一个内存区域,然后将我的数据结构映射到该区域。这有几个性能优势,特别是对于数学繁重的应用程序。

我知道我无法在 JavaScript(或 Java)中分配内存和映射我自己的数据结构。但是,我可以创建一个堆栈/队列/堆,其中包含一些预定数量的对象,例如 Vector 对象。在处理数字时,我通常一次只需要几个这样的对象,但随着时间的推移会生成大量对象。通过重用旧的矢量对象,我可以避免创建/删除时间、不必要的垃圾收集时间以及等待垃圾收集时可能占用的大量内存。我还假设它们在内存中都将保持相当接近,因为它们是同时创建的并且被频繁访问。

我想对此进行测试,但我缺少内存分析工具。我试过 FireBug,但它没有告诉你 JavaScript 引擎当前分配了多少内存。

我能够编写一个简单的 CPU 性能测试代码(见下文)。我将具有 10 个“Vector”对象的队列与每次使用 new/delete 进行了比较。为了确定我不只是使用空数据,我分配了 Vector 6 浮点属性、一个三值数组( float )和一个 18 字符的字符串。每次我创建一个向量时,无论使用哪种方法,我都会将所有值设置为 0.0。

结果令人鼓舞。显式管理方法最初速度更快,但 javascript 引擎有一些缓存,并且在运行几次测试后 catch 了速度。最有趣的部分是,当我尝试对 1000 万个对象运行标准的新建/删除时,FireBug 崩溃了,但我的队列方法运行良好。

如果我能找到内存分析工具,我想在不同的结构(数组、堆、队列、堆栈)上测试它。我还想在一个真实的应用程序上测试它,也许是一个 super 简单的光线追踪器(快速编码,可以测试非常大的数据集和大量数学以获得很好的分析)。

是的,我在创建这个问题之前进行了搜索。我发现的所有内容要么是关于 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 - JavaScript 中的性能内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10253434/

相关文章:

javascript - Vue js,缺少从 HTML 到相关 JS 的映射

javascript - 不同屏幕宽度的随机高度

memory - 由于长时间运行进程的日志导致 Docker 守护进程内存泄漏

linux内核频繁分配大内存选择内存分配api

javascript - "combine this with previous var . . ."声明

javascript - codemirror PHP 自动完成功能

php - map 聚类算法

c# - 检查 C# 代码性能的最佳方法

mysql - 几乎相同的查询中的巨大性能差异

memory - 从编译为 Emscripten 的 Rust 获取 Javascript 中的数组