JavaScriptCore嵌套的“调用”性能问题
如果我定义一个函数
inc = function(x) { return x + 1 }
并对其进行嵌套调用
inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(1)))))))))))))))))))))
这将导致值22
。 如果我修改嵌套expression式而不是使用call
,则this
传入null
inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, 1)))))))))))))))))))))
这也将产生值22
。
但是,在JavaScriptCore上,第二种forms似乎消耗了O (2 ^ n )内存,其中n是嵌套调用的数量。 如果我在Firefox或Chrome中尝试这种JavaScript,那么情况并非如此,因此它似乎与JavaScriptCore隔离。
我有很less的JavaScript经验(几乎没有)。 我没有感觉到各种JavaScript实现可能做出的折衷,也不知道示例代码在某些实现中是否昂贵(为闭包等提供通用支持)是合理的,而在其他实现中则是有效的。
我的问题是:这个代码固有问题吗? 是否应该改写成不同的结构? 还是代码好 – JavaScriptCore只是有一个bug?
我已经做了一些实验,重构一些临时内部调用会“截断”内存加倍行为
var temp1 = inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, 1))))))); var temp2 = inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, temp1))))))); inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, temp2)))))));
基于对这个问题的评论,共识是这个代码没有根本的问题,但是这是JavaScriptCore中的一个错误。
对于提交的票据 ,已被确认为可重复使用并已导入苹果雷达系统。