哪个更节省内存,对象初始值设定项或数组?
Which saves more memory, Object initializer or Array?
假设一个对象包含两个字段 id
和 name
。我想在一个数组中存储 10000 个这样的对象。我有以下两个选择:
选项 1
var pairs = [];
for(var i=0; i<10000; i++) {
pairs.push({"id": i, "name": "xxx"});
}
选项 2
var pairs = [];
for(var i=0; i<10000; i++) {
pairs.push([i, "xxx"]);
}
假设不需要存储密钥,哪个选项的结果 pairs
可以节省更多内存?有没有更好的选项可以提高内存效率?
你可以测量它们。
对于所有示例,我将静态 "xxx"
字符串更改为更真实的内容(即每个 id
唯一)。
t1
和 t2
是你的,t3
是我的更节省内存布局的想法,a pair of "array-of-structs",一个用于 id,一个用于名字。
const process = require("process");
function t1() {
var pairs = [];
for (var i = 0; i < 10000; i++) {
pairs.push({ id: i, name: i.toString(36) });
}
return pairs;
}
function t2() {
var pairs = [];
for (var i = 0; i < 10000; i++) {
pairs.push([i, i.toString(36)]);
}
return pairs;
}
function t3() {
var names = [];
var ids = [];
for (var i = 0; i < 10000; i++) {
ids.push(i);
names.push(i.toString(36));
}
return [ids, names];
}
const funcs = { t1, t2, t3 };
const func = funcs[process.argv[process.argv.length - 1]];
const m1 = process.memoryUsage();
console.log(func);
const x = func();
const m2 = process.memoryUsage();
console.log(m2.rss - m1.rss);
在我的节点 16 中,输出:
$ node so-memory-test.js t1
[Function: t1]
4018176
$ node so-memory-test.js t2
[Function: t2]
4759552
$ node so-memory-test.js t3
[Function: t3]
1622016
这意味着 AoS 结构是最薄的。
假设一个对象包含两个字段 id
和 name
。我想在一个数组中存储 10000 个这样的对象。我有以下两个选择:
选项 1
var pairs = [];
for(var i=0; i<10000; i++) {
pairs.push({"id": i, "name": "xxx"});
}
选项 2
var pairs = [];
for(var i=0; i<10000; i++) {
pairs.push([i, "xxx"]);
}
假设不需要存储密钥,哪个选项的结果 pairs
可以节省更多内存?有没有更好的选项可以提高内存效率?
你可以测量它们。
对于所有示例,我将静态 "xxx"
字符串更改为更真实的内容(即每个 id
唯一)。
t1
和 t2
是你的,t3
是我的更节省内存布局的想法,a pair of "array-of-structs",一个用于 id,一个用于名字。
const process = require("process");
function t1() {
var pairs = [];
for (var i = 0; i < 10000; i++) {
pairs.push({ id: i, name: i.toString(36) });
}
return pairs;
}
function t2() {
var pairs = [];
for (var i = 0; i < 10000; i++) {
pairs.push([i, i.toString(36)]);
}
return pairs;
}
function t3() {
var names = [];
var ids = [];
for (var i = 0; i < 10000; i++) {
ids.push(i);
names.push(i.toString(36));
}
return [ids, names];
}
const funcs = { t1, t2, t3 };
const func = funcs[process.argv[process.argv.length - 1]];
const m1 = process.memoryUsage();
console.log(func);
const x = func();
const m2 = process.memoryUsage();
console.log(m2.rss - m1.rss);
在我的节点 16 中,输出:
$ node so-memory-test.js t1
[Function: t1]
4018176
$ node so-memory-test.js t2
[Function: t2]
4759552
$ node so-memory-test.js t3
[Function: t3]
1622016
这意味着 AoS 结构是最薄的。