node.js数组与来自内存使用点的对象

时间:2018-02-17 16:05:59

标签: javascript arrays node.js memory-management javascript-objects

想要在Win 10下使用node.js v6.11.0分享我运行的简单实验。

目标即可。根据占用的内存比较数组与对象。

代码即可。每个函数referencetwoArraysmatrixobjects都会创建两个大小相同的数组,其中包含随机数。他们有点不同地组织数据。

reference创建两个固定大小的数组,并用数字填充它们。

twoArrays通过push填充两个数组(因此解释器不知道最终大小)。

objects通过push创建一个数组,每个元素都是一个包含两个数字的对象。

matrix创建一个双行矩阵,也使用push。

const SIZE = 5000000;
let s = [];
let q = [];
function rand () {return Math.floor(Math.random()*10)}
function reference (size = SIZE) {
    s = new Array(size).fill(0).map(a => rand());
    q = new Array(size).fill(0).map(a => rand());
}
function twoArrays (size = SIZE) {
    s = [];
    q = [];
    let i = 0;
    while (i++ < size) {
        s.push(rand());
        q.push(rand());
    }
}
function matrix (size = SIZE) {
    s = [];
    let i = 0;
    while (i++ < size) s.push([rand(), rand()]);
}
function objects (size = SIZE) {
    s = [];
    let i = 0;
    while (i++ < size) s.push({s: rand(), q: rand()});
}

结果即可。在新环境中单独运行每个函数后,在几次调用global.gc()之后,Node.js环境占用了以下内存大小:

reference:84 MB

twoArrays:101 MB

objects:249 MB

matrix:365 MB

theoretical:假设每个数字需要8个字节,大小应为5 * 10 ^ 6 * 2 * 8~80 MB

我们看到,reference导致了最轻的内存结构,这很明显。

twoArrays占用了更多的内存。我认为这是因为当下一个push操作超过预分配空间时,那里的数组是动态的,并且解释器以块的形式分配内存。因此,最终的内存分配完成了超过5 ^ 10个数字。

objects很有意思。虽然每个对象都是固定的,但似乎解释器并不这么认为,并且为每个对象分配了更多的空间。

matrix也非常有趣 - 显然,在代码中显式数组定义的情况下,解释器会分配比所需更多的内存。

结论即可。如果您的目标是高性能应用程序,请尝试使用数组。它们也很快,只有O(1)时间进行随机访问。如果项目的性质需要对象,您也可以经常使用数组来模拟它们(如果每个对象中的属性数量是固定的)。

希望这是有用的,希望听到人们的想法,或者可能有一些更彻底的实验链接......

0 个答案:

没有答案