首先,"[unknown]"的意思是采样器无法确定函数的名称,因为它是系统或库函数。如果是这样,那就没关系 - 你不用在意,因为你要找的是与时间有关的代码,而不是系统代码。
实际上,我建议这是
XY问题之一。即使你得到了直接回答你所问的问题,也很可能没有什么用处。以下是原因:
1. CPU分析对于I/O绑定程序几乎没有用处
你火焰图左侧的两座塔正在进行I/O操作,因此它们的墙上时间可能比右侧的大堆要长得多。如果这个火焰图是从墙上时间采样中得出的,而不是CPU时间采样中得出的,它可能看起来更像下面的第二张图,告诉你时间实际上去了哪里:
![enter image description here](https://istack.dev59.com/ZmoS1.webp)
右边看起来很重要的一堆东西现在缩小了,不再那么重要。另一方面,I/O塔非常宽。如果你的代码中有任何一个宽橙色条纹,那就是节省大量时间的机会,如果可以避免一些I/O。
2. 无论程序是CPU密集型还是I/O密集型,加速机会都可能隐藏在火焰图中。
假设有一些函数Foo真的在浪费资源,如果你知道了这个问题,就可以解决它。假设在火焰图中,它是深红色的。假设它从代码中的许多地方被调用,因此它不会在火焰图中的一个位置上集中显示。相反,它出现在多个小地方,如黑色轮廓所示:
![enter image description here](https://istack.dev59.com/PGyE7.webp)
注意,如果收集所有这些矩形,你会发现它占据了11%的时间,这意味着值得关注。
如果能将其时间缩短一半,你可以总体节省5.5%的时间。
如果它所做的实际上可以完全避免,你可以总体节省11%的时间。
每个小矩形都会缩小到零,并将其右侧的图形一起拉动。
现在我将展示
我使用的方法。我随机取样适量的堆栈样本,并检查每个样本以查找可能加速的例程。
这相当于在火焰图中进行如下采样:
![enter image description here](https://istack.dev59.com/kceN4.webp)
细长的垂直线代表20个随机时间堆栈样本。
您可以看到,其中三个标有
X。
这些是通过
Foo
的内容。
这大约是正确的数字,因为11%乘以20是2.2。
(感到困惑?好吧,这里有一点概率知识。如果你抛硬币20次,并且它有11%的机会出现正面,你会得到多少个正面?从技术上讲,这是一个二项式分布。您最有可能得到的数字是2,下一个最有可能的数字是1和3。(如果您只得到1,则会继续进行,直到获得2个)。这是分布图:)
![enter image description here](https://istack.dev59.com/P07JF.webp)
你需要取样18.2次才能看到两个Foo
。
看那20个样本可能有些令人生畏,因为它们运行在20到50个级别之间。
然而,你基本上可以忽略所有不是你的代码的代码。
只检查它们是否包含你的代码。
你将精确地看到你花费时间的方式,
并且你会有一个非常粗略的测量结果。
深度堆栈既是坏消息又是好消息 -
它们意味着代码很可能有很多加速的空间,并且它们向你展示了这些空间。
如果你看到任何可以加速的东西,如果你在超过一个样本中看到它,它将为你提供健康的加速,保证。
你需要在超过一个样本中看到它的原因是,如果你只在一个样本中看到它,你只知道它的时间不为零。如果你在超过一个样本中看到它,你仍然不知道它需要多少时间,但你知道它不小。
以下是统计数据。