我遇到了一个非常慢的API调用问题,并希望使用Xhprof找出它所导致的内容:默认的GUI和调用图。该如何分析这些数据?
在代码中找到应该优化的地方的方法是什么,尤其是最昂贵的瓶颈?
答案 0 :(得分:1)
在所有这些专栏中,重点关注名为“IWall%”的专栏,第5栏。
请注意,send
,doRequest
,read
和fgets
每个都有72%的挂钟时间。
这意味着如果您使用了100个堆栈样本,那么每个例程都会发现自己的72个,给予或接受,我怀疑它们会一起出现。 (你的图表也应该显示出来。)
因此整个过程需要23秒,这意味着大约需要17秒才能阅读。 如果你能发现某些阅读是不必要的,你可以减少17秒的唯一方法就是这样。你能吗?
剩下的28%(6秒)怎么样? 首先,值得吗? 即使你可以将其减少到零(总共17秒,你不能),加速因子将是1 /(1-0.28)= 1.39,或39%。 如果你可以减少一半(总共20秒),它将是1 /(1-0.14)= 1.16,或16%。 20秒对23秒,由你来决定是否值得这么麻烦。
如果您认为是这样,我建议采用random pausing方法,因为它不会让您充满噪音。 它是正确的问题的核心,不仅告诉你哪些例程,而且告诉你哪些代码行,以及它们为什么被执行。 (为什么是最重要的,因为如果绝对必要,你不能替换它。 对于分析器,您倾向于认为这是必要的,因为您无法另行说明。)
由于你正在寻找占据大约14%时间的东西,你平均需要检查2 / 0.14 = 14个样本才能看到它两次,这将告诉你它是什么。
请记住,大约14 * 0.72 = 10个样本将落在fgets
(及其所有调用者)中,因此您可以忽略它们或使用它们来确保所有I / O都是必需的。
(例如,你是否有可能两次读东西,因为一些晦涩难懂的原因,比如这样做更容易?我已经看过了。)