Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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中,在对象上装箱每个数字和字符串的性能代价是什么?_Javascript_Performance_Hash_Lisp - Fatal编程技术网

在JavaScript中,在对象上装箱每个数字和字符串的性能代价是什么?

在JavaScript中,在对象上装箱每个数字和字符串的性能代价是什么?,javascript,performance,hash,lisp,Javascript,Performance,Hash,Lisp,为了学习,我正在JavaScript上编写一种类似Lisp的语言。每个对象都是树的一部分,因此它必须跟踪其父对象。唯一的问题是数字和字符串: foo = {}; var a = 1; a.parent = foo; 这是行不通的。我必须这样做: foo = {}; var a = {type:'number',value:1,parent:foo} 因此,我必须将我语言中的每个数字和字符串都放入这样的散列中。我假装在说的语言上做了一些广泛的矩阵运算,所以我很担心。这种方法会影响性能吗?正如里

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

foo = {};
var a = 1;
a.parent = foo;
这是行不通的。我必须这样做:

foo = {};
var a = {type:'number',value:1,parent:foo}
因此,我必须将我语言中的每个数字和字符串都放入这样的散列中。我假装在说的语言上做了一些广泛的矩阵运算,所以我很担心。这种方法会影响性能吗?

正如里德所建议的:

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);

这可能回答了这个问题。我想知道是否有一种替代方案不会受到如此高的性能冲击。

当然会受到冲击。这一打击是否重要完全是另一个问题。我建议编写一些示例代码并对其进行基准测试,看看其性能是否可以接受。仅仅通过阅读代码就几乎不可能判断某些东西的性能是否可以接受,而且你不应该成为微优化的牺牲品。这是一个好主意。但为什么要投票结束呢?这根本不是很本地化。在一种散列无处不在的语言中,了解散列的性能成本是非常广泛的。我不是投票决定关闭的人。老实说,性能的影响会因代码中花费的大部分时间而有所不同。与矩阵数学相比,设置对象可能微不足道,但同时,在矩阵数学中对对象执行属性访问器可能一点也不差。老实说,您只需对它进行基准测试,看看它是否符合您的需要,如果不符合,请回来问另一个关于如何改进它的问题。在这种情况下,您可以使用数组进行测试(使用数字索引,0=父级,1=类型,3=值)。我还没有进行基准测试,但我希望查找速度会快一点,但可能太少,以至于不明显。我已经运行了一些测试,将其作为答案放在这里。绝对不是个好主意。否则,我如何跟踪父关系?对于性能测试,我建议使用Nice。它应该是Number()而不是Number()
Operations with boxing: 1911258
Operations without boxing: 16805783