在JavaScript中,将每个数字和字符串封装成对象会带来什么性能损耗?

3

我正在用JavaScript编程一个类似于Lisp的语言,目的是为了学习。每个对象都是树的一部分,因此它必须跟踪其父级。唯一的问题是数字和字符串:

foo = {};
var a = 1;
a.parent = foo;

这样做是行不通的。我必须采取以下方式:
foo = {};
var a = {type:'number',value:1,parent:foo}

所以我需要像这样将我的语言中的每个数字和字符串都放入哈希表中。我打算在该语言上进行一些复杂的矩阵数学运算,所以我很担心这种方法会影响性能。


1
当然它会很受欢迎。但这是否重要是另一个完全不同的问题。我建议编写一些示例代码并进行基准测试,以确定其性能是否可接受。仅通过阅读代码就判断某个东西是否表现良好几乎是不可能的,您不应陷入微观优化的陷阱。 - Reid
这是一个好主意。但为什么要投票关闭呢?这根本不是很局部化的问题。在哈希表无处不在的语言中,了解哈希表的性能成本是非常广泛的。 - MaiaVictor
我不是那个投票关闭的人。老实说,性能损失将取决于您的代码中大部分时间花费在哪里。设置对象可能相对于矩阵计算而言微不足道,但同时,在矩阵计算中执行对象的属性访问器可能并不会太糟糕。老实说,您只需要进行基准测试,看是否符合您的需求,如果不符合,就回来询问如何改进它。 - Reid
在这种情况下,您可以使用数组进行测试(具有数字索引,0=父级,1=类型,3=值)。我还没有进行基准测试,但我预计查找速度会更快,但可能如此之小以至于不会被注意到。 - some
我已经运行了一些测试,将其放在这里作为答案。绝对不是一个好主意。否则,我如何跟踪父关系呢? - MaiaVictor
@Dokkat 这取决于您想要做什么。显式的父子关系真的必要吗?您可以代表自上而下的树形结构。 - Matthias Benkard
1个回答

1

正如Reid所建议的:

function number(n){
    return {type:'number',parent:undefined,value:n};
}
function sum(a,b){
    return {type:'number',parent:undefined,value:a.value+b.value};
}
var i = number(0);
for (var t=Date.now(); Date.now()-t < 1000;){
    var i=sum(i,number(1));}
console.log('Operations with boxing: ',i.value);
var i = 0;
for (var t=Date.now(); Date.now()-t < 1000;){
    var i=i+1;}
console.log('Operations without boxing: ',i);

输出:

Operations with boxing: 1911258
Operations without boxing: 16805783

这可能回答了问题。我想知道是否有一种替代方案,不会对性能造成如此大的影响。


针对性能测试,我建议使用http://jsperf.com/。 - Rob W
不错。http://jsperf.com/calculations-after-boxing-numbers-inside-an-object - MaiaVictor
应该写成 Number() 而不是 number()。 - Jordan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接