洞察v8最大堆栈帧数/大小

时间:2017-07-02 10:57:52

标签: javascript v8 callstack stackframe

我希望更详细地了解最大堆栈帧数/大小。

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

// <Variable part here>更改为:

测试案例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源相关的链接都会很棒。即使只显示设置堆栈大小内存限制的位置也是很好的介绍。对安德烈亚斯罗斯伯格和杰姆克已经分别留下他们的好答案和评论时没有问这个的道歉。

1 个答案:

答案 0 :(得分:2)

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

这就是说 - 一如既往 - 微观基准不会提供有用的信息,最糟糕的是会产生误导。你真的需要测量你关心的具体程序。