0

我遇到了一个非常慢的 API 调用问题,并想找出它是由什么引起的,使用 Xhprof:默认 GUI 和调用图。应该如何分析这些数据?

找到代码中应该优化的地方的方法是什么,尤其是最昂贵的瓶颈?

在此处输入图像描述

在此处输入图像描述

4

1 回答 1

1

在所有这些列中,关注名为“IWall%”的第 5 列。请注意,senddoRequestreadfgets每一列都包含 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 秒,由您决定是否值得麻烦。

如果你决定是这样,我推荐随机暂停方法,因为它不会让你充满噪音。它直击问题的核心,不仅告诉您哪些例程,还告诉您哪些代码行,以及为什么要执行它们。(为什么是最重要的,因为如果它是绝对必要的,你不能替换它。使用分析器,你倾向于假设它是必要的,因为你没有办法说别的。)

由于您正在寻找大约 14% 的时间的东西,因此您将不得不检查 2/0.14 = 14 个样本,平均而言,要查看两次,这将告诉您它是什么。请记住,大约有 14 * 0.72 = 10 个样本将进入fgets(及其所有调用者),因此您可以忽略这些样本或使用它们来确保所有 I/O 都是真正必要的。(例如,您是否有可能因为某些晦涩的原因而阅读了两次,例如这样做更容易?我已经看到了。)

于 2015-09-05T14:27:10.490 回答