如何可视化常规调用堆栈并计算内部和外部执行时间非常明显。但是,如果已经处理了协同程序,则调用堆栈看起来非常混乱。一个协程可能不会向其父级执行,而是向另一个协程执行(例如greenlet)。是否有一些常用的方法可以为这种情况制作一致的分析输出?
答案 0 :(得分:1)
同时考虑所有线程的堆栈的单个样本。
您需要知道的是 - 谁在等谁,以及为什么。 通常如果函数A在堆栈上高于B,则意味着A正在等待B返回,原因是A想要B做某事。 如果你看一个完整的堆栈,对于一个线程,你会得到一系列原因,为什么那个特定的纳秒被这个线程所花费。 如果您正在寻找速度,那么您正在寻找一些理由,而这些理由完全不是您真正需要的(因为存在薄弱环节)。 即使链在I / O中结束,这也可以工作。 如果是用户输入,它只是在等待用户。 但是,如果它的输出,磁盘I / O或普通的旧CPU启动,您可能能够做一些事情来减少它,并获得性能提升(如果您在2个或更多样本上看到相同的问题)
如果线程A在等待线程B怎么办? 那么你在A堆栈底部看到的是一个等待另一个线程的函数。 您需要确定哪个是线程B,并查看其堆栈,因为它所用的时间越长,A所需的时间就越长。 所以这更难,但你当然不会害怕。
我在这里谈论手动分析,您可以在调试器中自己采样,并将全部注意力集中在每个样本上。 分析工具往往假设你很懒,只想要数字,如果没有跳出这些数字,你会很高兴,因为你什么都没发现。 事实上,如果一些愚蠢的不必要的活动占用了30%的时间,那么平均而言,你需要看两次的样本数量是2 / 0.3 = 6.67个样本(不是一个大数字),你很可能会看到它和the profiler will not。 那是random pausing。