JavaScriptCore 嵌套的“调用”性能问题

JavaScriptCore nested "call" performance issue

本文关键字:性能 问题 调用 嵌套 JavaScriptCore      更新时间:2023-09-26

如果我定义一个函数

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 只是有一个错误吗?

我做过一些实验,重构一些对临时的内部调用将"截断"内存加倍行为

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中的一个错误。

对于提交的票证,它已被确认为可复制的,并已导入Apple的雷达系统。