JavaScriptCore嵌套“调用”性能问题

时间:2014-12-19 14:40:27

标签: javascript 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。如果我修改嵌套表达式而不是使用call,则为null传递this,作为

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上,第二种形式似乎消耗了 O (2 ^ n )内存,其中 n 是嵌套调用的数量。如果我在Firefox或Chrome中尝试使用此JavaScript,则情况并非如此,因此它似乎与JavaScriptCore隔离。

我的JavaScript经验非常少(几乎没有)。我不了解各种JavaScript实现可能做出的权衡,也不了解示例代码在某些实现中是否合理(对闭包或某些实现提供通用支持),而在其他实现中则有效。

我的问题是:这段代码本质上存在问题吗?是否应该以不同的方式重写?或者代码很好 - JavaScriptCore只是有一个bug吗?

我已经做了一些实验,重构一些对临时的内部调用将会#34;截断"记忆倍增行为

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

1 个答案:

答案 0 :(得分:12)

根据对这个问题的评论,大家一致认为编写的代码没有根本问题,但这是JavaScriptCore中的一个错误。

对于ticket filed,它已被确认为可重现且已导入Apple的雷达系统。