想要在Win 10下使用node.js v6.11.0分享我运行的简单实验。
目标即可。根据占用的内存比较数组与对象。
代码即可。每个函数reference
,twoArrays
,matrix
和objects
都会创建两个大小相同的数组,其中包含随机数。他们有点不同地组织数据。
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)时间进行随机访问。如果项目的性质需要对象,您也可以经常使用数组来模拟它们(如果每个对象中的属性数量是固定的)。
希望这是有用的,希望听到人们的想法,或者可能有一些更彻底的实验链接......