Javascript Profiler in Chrome 79 for Windows: 自拍包括什么?

Javascript Profiler in Chrome 79 for Windows: What does self-time include?

运行 in-browser Javascript in Chrome 79 for Windows :: 从类似的线程中,听起来自拍时间只包括到 [=24 的时间=] 特定函数内的内联代码,不包括花费 运行 宁子函数的任何时间。

但是,在实践中,我注意到我的应用程序中一些进行大量子调用的函数与其他具有很少或没有子调用的类似大小的函数相比似乎有过多的自用时间电话。 (即我正在比较两个具有相对相似操作的函数,以及操作数)。这两个函数的自拍时间可以相差10倍

我想知道自拍时间是否包括准备那些电话等的时间?

也许,带有子调用的函数的一些较高的自运行时间可能是由于 V8 的后期优化,因此在分析器的采样时间内,我正在比较自运行时间一个优化的函数与一个尚未优化的函数,在优化之前可能 运行 慢 100 倍。也许这就是罪魁祸首?

self-time includes only time to run the in-line code within a particular function, and excludes any time spent running sub functions

是的,"self time" 是给定函数中出现的刻度样本数。

I'm wondering if self-time includes time to prepare for those calls, etc?

"time to prepare calls"不单独测量。

I have noticed that some functions in my app that make a lot of sub-calls seem to have an inordinate amount of self-time

我猜你观察到的是内联造成的。当一个函数被优化时,编译器决定内联一个或多个被调用的函数,然后分析器可能无法区分哪些指令最初来自哪里(内联之所以有益的部分原因是因为它可以消除冗余,这自然会模糊给定指令的原始功能的界限 "belongs to")。这有意义吗?

如果要在分析时排除内联的影响,可以关闭内联。在 Node/V8 中,您可以 运行 和 --noturbo-inlining。 (FWIW,在 C/C++ 中也是如此,其中 GCC/Clang 理解 -fno-inline。)请注意,关闭内联会改变应用程序的性能特征,因此它可以产生误导性结果(具体来说:可能是在没有内联的情况下,您会观察到一个性能问题,当内联打开时,该问题就会消失);但它也有助于查明什么是缓慢的。