第二种方法本质上是堆栈采样。您可以尝试通过某种进出事件捕获自己来完成,或者如果有一个实用程序来实际读取堆栈会更好。后者的优势在于您可以获得代码行分辨率,而不仅仅是方法级别。
很多人对此并不了解,那就是时间测量的精度远不如问题识别的精度重要。
即使在 I/O 或其他阻塞期间进行采样也很重要,因此您不会对不必要的 I/O 视而不见。如果您担心与其他流程的竞争可能会增加时间,请不要担心,因为真正重要的不是绝对时间测量,而是百分比。例如,如果一行代码在堆栈上占挂钟时间的 50%,因此要负责这么多,那么无论发生什么其他事情,删除它都会使应用程序的速度加倍。
分析不仅仅是获取样本。人们通常对他们对他们的所作所为很随意,但这就是钱的所在。首先,包含时间是方法或代码行在堆栈上的时间分数。忘记“自我”时间——它包含在包容性时间中。忘记调用计数 - 它与包含百分比的关系充其量是非常间接的。如果你在总结,最好的方法是有一个“蝴蝶视图”,它的重点是一行代码。它的左右是堆栈样本上紧邻其上方和下方的代码行。每行代码旁边都有一个百分比 - 包含该行代码的堆栈样本的百分比。(不用担心递归。这根本不是问题。)
比任何类型的总结更好的是让用户自己看到堆栈样本的一小部分随机选择。这样,用户就可以全面了解每个快照的使用时间。保证出现在多个样本上的任何可避免的活动都有可能实现一些严重的加速。人们经常认为“嗯,这可能只是侥幸,而不是真正的瓶颈”。不是这样。修复它会得到回报,也许是一点点,也许是很多,但平均而言——意义重大。人们不应该被风险厌恶所统治。
更多关于这一切。