【问题标题】:JavaScriptCore nested "call" performance issueJavaScriptCore 嵌套“调用”性能问题
【发布时间】:2014-12-19 14:40: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)))))));

【问题讨论】:

  • 我肯定会称之为错误。
  • 谢谢@Pointy。我已经向 Apple 提交了 rdar。
  • 将 rdar 移至 WebKit:bugs.webkit.org/show_bug.cgi?id=139847
  • 这个问题似乎离题了,因为它实际上只是一个错误报告,这篇文章提出的三个问题中有两个主要是基于意见的。
  • 这个问题不是主观的。它是关于特定 JavaScript VM 的行为是否正常。此外,由于 iOS 是常见的开发目标,因此其他程序员会想知道这个问题。

标签: javascript javascriptcore


【解决方案1】:

基于 cmets 关于这个问题的共识是,编写的代码没有根本问题,但这是 JavaScriptCore 中的一个错误。

对于ticket filed,已确认可重现并已导入苹果的雷达系统。

【讨论】:

  • 只是想知道 inc(x) 通常何时在内部脱糖到 inc.call(window, x) 中。 null 是否必须对此做些什么。
  • @jsHero 我尝试了一个涉及inc.call(window, inc.call(window, inc.call(window, ... 的测试,它表现出同样的问题。
  • 谢谢迈克。我不明白为什么这个问题已关闭,一些苹果开发人员可能应该回复这个错误的原因。无论如何,这是一个很好的发现@mike。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多