【问题标题】:Insight into v8 max stack frames / size深入了解 v8 最大堆栈帧/大小
【发布时间】:2017-12-05 19:21:59
【问题描述】:

我想更详细地了解最大堆栈帧/大小。

function computeMaxCallStackFrames() {
    try {
        //
        // <Variable part here>
        //
        return 1 + computeMaxCallStackFrames();
    } catch (e) {
        // Call stack overflow
        return 1;
    }
}
computeMaxCallStackFrames()  // 5447  on Chrome 58.0.3029.110, Mac 10.11

// &lt;Variable part here&gt; 更改为:

测试用例 1:

var a = 1;
// computeMaxCallStackFrames() => 5220

测试用例 2:

var a = 1;
var b = 2;    
// computeMaxCallStackFrames() => 5011

测试用例 3:

var a = 1;
var b = {};    
// computeMaxCallStackFrames() => 5011  (no change from `var b = 2;`)

测试用例 4:

var a = 1;
var b = {c: 3};    
// computeMaxCallStackFrames() => 5010

我的问题是为什么 Test case 4 会发生变化,以及为什么它会减少 1 个堆栈帧。

** 编辑 ** 任何指向 v8 源代码的相关链接都很棒。即使只是显示设置堆栈大小内存限制的位置也是很好的介绍。很抱歉,当 Andreas Rossberg 和 jmrk 已经分别留下了他们很好的答案和 cmets 时,没有问这个问题。

【问题讨论】:

    标签: javascript v8 callstack stack-frame


    【解决方案1】:

    有很多很多因素会影响 V8 和其他 JS 引擎中单个堆栈帧的大小:例如,参数的数量、变量的数量、这些变量的生命周期、这些变量的使用方式,它们是否在内部闭包中被捕获,是否有 try-handlers,函数中发生了哪些其他操作(内部可能需要临时变量),甚至之前已经传递给函数的实际参数的类型。此外,这一切都取决于运行时分析和函数(以及它可能调用的其他函数)的优化级别,这可能会随着时间而变化,甚至取决于它何时被编译/优化/去优化,这可能有些不确定。

    这就是说——和往常一样——微基准不会提供有用的信息,最坏的情况是会产生严重的误导。你真的需要衡量你关心的具体程序。

    【讨论】:

    • 明白了,希望有人能说出所有这些;) 还希望有人可以跟进一个指向 v8 源代码的链接,该链接显示一些注释或测试用例,其中检测到空的未变异对象并制作为引用一些现有的空对象,其中新的非空对象被放入堆中,然后后续相同的、未变异的、未访问的对象只是引用它......我知道的大问题。
    • 对此答案+1。添加一个小数据点:如果您使用--print-bytecode,您可以看到函数的帧大小在案例 2、3、4 中是相同的(我在最近的构建中看到“48”;对于不同的版本,该值可能不同)。所以它不是computeMaxCallStackFrames 本身,而是系统中的其他地方在对象文字非空时使用了更多的堆栈空间。
    • @AJP 的评论:如果你想问另一个问题,请再问一个问题。简短的回答是对象文字处理比您建议的要复杂得多。并且没有对象的“重复数据删除”(空/未修改或其他),因为身份是可观察的:var a = {}; var b = {}; a === b /* -&gt; false */
    • 感谢 jmrk。 identity is observable,是的,明白了。我的评论应该是“未变异、未观察到的对象”,而不是“未变异、未访问的对象”,尽管我明白这可能是不可能的,而且听起来这不是这里发生的优化/行为之一。
    猜你喜欢
    • 2015-03-15
    • 2014-02-25
    • 2021-12-28
    • 2016-09-26
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    相关资源
    最近更新 更多