Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js阵列与利用内存的对象_Javascript_Arrays_Node.js_Memory Management_Javascript Objects - Fatal编程技术网

Javascript node.js阵列与利用内存的对象

Javascript node.js阵列与利用内存的对象,javascript,arrays,node.js,memory-management,javascript-objects,Javascript,Arrays,Node.js,Memory Management,Javascript Objects,想分享我运行的一个简单实验,使用Win10下的node.jsv6.11.0 目标。根据占用的内存比较数组和对象 代码。每个函数引用,两个数组,矩阵和对象创建两个大小相同的数组,其中包含随机数。他们对数据的组织有点不同 reference创建两个固定大小的数组,并用数字填充它们 twoArrays通过push填充两个数组(因此解释器不知道最终大小) objects通过push创建一个数组,每个元素是一个包含两个数字的对象 matrix创建两行矩阵,也使用push const SIZE = 5000

想分享我运行的一个简单实验,使用Win10下的node.jsv6.11.0

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

代码。每个函数
引用
两个数组
矩阵
对象
创建两个大小相同的数组,其中包含随机数。他们对数据的组织有点不同

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()});
}
const SIZE=5000000;
设s=[];
设q=[];
函数rand(){return Math.floor(Math.random()*10)}
函数引用(大小=大小){
s=新数组(size).fill(0).map(a=>rand());
q=新数组(size).fill(0).map(a=>rand());
}
函数数组(大小=大小){
s=[];
q=[];
设i=0;
while(i++
结果。在新环境中单独运行每个函数,并调用
global.gc()
几次后,Node.js环境占用了以下内存大小:

参考
:84 MB

两个阵列
:101 MB

对象
:249 MB

矩阵
:365 MB

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

我们看到,
reference
产生了最轻的内存结构,这是显而易见的

twoArrays
占用了更多的内存。我认为这是因为那里的数组是动态的,并且解释器在下一次推送操作超过预先分配的空间时就以块的形式分配内存。因此,最终的内存分配是针对5^10个以上的数字进行的

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

matrix
也很有趣——显然,在代码中有显式数组定义的情况下,解释器分配的内存比所需的要多

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


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

结论部分应该是答案。@Andreas:只要是问答形式,分享你的发现是可以的。OP需要将问题编辑成简洁的形式,如“对象是否比数组占用更多内存”,并将其余部分作为答案发布。@georg我知道,我的评论是要将OP“推”到这个方向,以将其帖子转换为正确的格式。@Ele(和OP):实际上我要写一个非常简短的问题(基本上是重新表述标题)并将所有内容放在“代码。每个函数…”后面作为答案。这就是我写问答对时所做的,比如。