首页 文章

JavaScriptCore嵌套“调用”性能问题

提问于
浏览
52

如果我定义一个函数

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吗?

我做了一些实验,重构一些内部调用临时工作将“截断”内存倍增行为

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 回答

  • 12

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

    对于ticket filed,它已被确认为可重复,并已导入Apple的雷达系统 .

相关问题