vas*_*aki 5 javascript arrays memory-management node.js javascript-objects
想分享一个我运行的简单实验,在 Win 10 下使用 node.js v6.11.0。
目标。在内存占用方面比较数组与对象。
代码。每个功能reference,twoArrays,matrix并objects创建两个相同尺寸的阵列,含有随机数。他们以稍微不同的方式组织数据。
reference 创建两个固定大小的数组并用数字填充它们。
twoArrays 通过推送填充两个数组(因此解释器不知道最终大小)。
objects 通过推送创建一个数组,每个元素是一个包含两个数字的对象。
matrix 创建一个两行矩阵,也使用推送。
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占用更多内存。我认为这是因为那里的数组是动态的,并且解释器会在下一个推送操作超过预分配空间时以块的形式分配内存。因此最终的内存分配是为超过 5^10 个数字完成的。
objects很有趣。虽然每个对象都是固定的,但解释器似乎并不这么认为,并且为每个对象分配了更多必要的空间。
matrix 也很有趣——显然,在代码中显式定义数组的情况下,解释器分配的内存比所需的多。
结论。如果您的目标是高性能应用程序,请尝试使用数组。它们也很快,随机访问的时间只有 O(1)。如果您的项目的性质需要对象,您也可以经常用数组模拟它们(如果每个对象中的属性数量是固定的)。
希望这是有用的,想听听人们的想法,或者可能有一些更彻底的实验的链接......
| 归档时间: | 
 | 
| 查看次数: | 473 次 | 
| 最近记录: |