Как определить узкие места с Xhprof?

У меня проблема с очень медленным вызовом API, и я хочу выяснить, чем это вызвано, используя Xhprof: графический интерфейс по умолчанию и граф вызовов. Как эти данные должны быть проанализированы?

Какой подход должен найти места в коде, которые должны быть оптимизированы, и особенно самые дорогие узкие места?

введите описание изображения здесь

введите описание изображения здесь

1 ответ

Из всех этих столбцов обратите внимание на столбец 5. IWall%. Обратите внимание, что 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, решать вам, стоит ли это того.

Если вы решите, что это так, я рекомендую метод случайной паузы, потому что он не затопляет вас шумом. В центре его внимания лежит не только то, какие подпрограммы, но какие строки кода и почему они выполняются. (Почему это наиболее важно, потому что вы не можете заменить его, если это абсолютно необходимо. С профилировщиками вы склонны считать, что это необходимо, потому что у вас нет способа сказать иначе.)

Так как вы ищете что-то, что занимает около 14% времени, вам придется исследовать в среднем 2/0,14 = 14 образцов, чтобы увидеть это дважды, и это скажет вам, что это такое. Имейте в виду, что около 14 * 0,72 = 10 из этих образцов попадет в fgets (и всех вызывающих), так что вы можете либо игнорировать их, либо использовать их, чтобы убедиться, что все эти операции ввода-вывода действительно необходимы. (Например, возможно ли, что вы читаете что-то дважды, по какой-то непонятной причине, будто так было проще? Я видел это.)

Другие вопросы по тегам