为什么chrome Devtools性能记录不显示某些调用的函数

rqenqsqc  于 2023-02-06  发布在  Go
关注(0)|答案(1)|浏览(158)

下面的代码可能不适合真实的世界,但它很好地说明了这个问题,如果你运行这段代码,123456789会在输出中正确打印,但你无法在Chrome Devtools性能记录中找到1-9所有对应的logger函数,我还启用了“高级打印工具”选项,但没有起到任何作用。
如何确保显示此操作中执行的所有功能?

function logger1() {
    for (var n = 0; n < 1e4; n++) {}
    console.log(1)
}
function logger2() {
    for (var n = 0; n < 1e4; n++) {}
    console.log(2)
}
function logger3() {
    for (var n = 0; n < 1e4; n++) {}
    console.log(3)
}
function logger4() {
    for (var n = 0; n < 1e4; n++) {}
    console.log(4)
}
function logger5() {
    for (var n = 0; n < 1e4; n++) {}
    console.log(5)
}
function logger6() {
    for (var n = 0; n < 1e4; n++) {}
    console.log(6)
}
function logger7() {
    for (var n = 0; n < 1e4; n++) {}
    console.log(7)
}
function logger8() {
    for (var n = 0; n < 1e4; n++) {}
    console.log(8)
}
function logger9() {
    for (var n = 0; n < 1e4; n++) {}
    console.log(9)
}
function logger10() {
    for (var n = 0; n < 1e4; n++) {}
    console.log(10)
}

function myCode() {
    const afn = new Promise(function promiseCallback(rs) {
        logger1()
        setTimeout(function timeOutCallBack() {
            logger6()
            rs("afn done")
            logger7()
        }, 1000)
        logger2()
    })

    async function myFm() {
        logger4()
        await afn
        logger8()
    }

    logger3()
    myFm()
        .then(function thenCallback() {
            logger9()
        })
        .catch(function catchCallback(e) {
            logger10()
            console.error(e)
        })
    logger5()
}

setTimeout(myCode, 1000)
sg24os4d

sg24os4d1#

分析基于采样:当前调用堆栈以一定的频率(我认为是每0.1ms一次,但我不完全确定)被采样。运行时间足够长或足够频繁的函数在统计上有很高的概率被这些样本遇到,其频率与花在它们身上的时间相关。运行时间非常短的函数可能不会被任何样本捕获。
具体来说:对于一个玩具的例子,为了确保所有的功能都显示在配置文件上,让它们运行更长的时间。
在现实世界中,如果一个函数没有出现在概要文件中,那么它运行得很快,不值得担心它的性能瓶颈。概要文件 * 将 * 显示任何消耗大量时间的函数。

相关问题