很明显,如何可视化一个常规调用堆栈并计算内部和外部执行时间。然而,如果一个人已经处理过协同,调用堆栈可能看起来相当混乱。我的意思是,一条协同线可能不会将死刑交给它的父母,而是交给另一条协同机制(例如。小绿)。对于这样的场景,是否有一些常见的方法来进行一致的分析输出?
发布于 2016-05-12 21:27:24
想一想一个单一的例子,所有线程的堆栈在同一时间。
你需要知道的是-谁在等谁,为什么。通常,如果函数A在堆栈上高于B,则表示A在等待B返回,其原因是A希望B做一些事情。如果您查看整个堆栈,因为一个线程,您会得到一个链的原因,为什么这个特定的纳秒被花费在这个线程上。如果你在寻找速度,你需要的是一系列根本不需要的原因(因为有一个薄弱环节)。即使链以I/O结尾,这也有效。如果它是用户输入,那么它只是在等待用户。但是,如果它是输出、磁盘I/O或普通的旧CPU运行,您可能会做一些事情来减少它,并获得性能增益(如果您在2个或更多的示例上看到了相同的问题)。
如果线程A正在等待线程B,怎么办?然后,您在A的堆栈底部看到的是一个等待其他线程的函数。您需要找出哪个是线程B,并查看它的堆栈,因为它花费的时间越长,A所用的时间就越长。所以这是比较困难的,但你肯定不怕。
我在这里讨论的是手动分析,您在调试器中自己采集样本,并将您的全部注意力应用于每个示例。分析工具倾向于假设你很懒,只想要数字,如果没有从这些数字中跳出来,你会很高兴,因为你什么也没有发现。事实上,如果一些愚蠢的不必要的活动花费了30%的时间,那么平均你需要看两次的样本数是2/0.3 = 6.67样本(不是一个很大的数字),你很可能会看到它和https://stackoverflow.com/a/25870103/23771。那是https://stackoverflow.com/a/378024/23771。
https://stackoverflow.com/questions/37190841
复制相似问题