Как измерить время обработки собственного кода без сторонних задержек

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

Поэтому мы хотим измерить время, затрачиваемое на обработку нашим собственным кодом, пока мы не ждем ответа от третьих лиц.

TL;DR: вот мое решение

Как измерить

Легко измерить время, потраченное вашим кодом, когда он не зависит от удаленных третьих сторон.

С асинхронным вызовом

Теперь, если мы добавим асинхронный вызов:

Легкий ответ! Просто получите время до и после асинхронного вызова и вычтите его:

С параллельными асинхронными вызовами

Проблема с асинхронными вызовами заключается в том, что вы никогда не знаете, когда они вернутся. Как бы вы оценили выполнение нескольких асинхронных функций, содержащих несколько асинхронных вызовов?

Вы не можете просто вычесть сумму продолжительности асинхронных вызовов:

Мое решение:

Первое: преобразовать массив asyncCalls в независимые события «начало» и «конец».

Затем упорядочите их по значению, чтобы вы могли пройтись по массиву в порядке событий, а не в порядке вызовов!

Теперь мы можем пройтись по событию, как по стеку вызовов.

Когда мы достигаем глубины 0, мы знаем, что не ждали запроса в этот момент

Можно возразить, что мы не учитываем нашу собственную обработку во время асинхронного вызова. Действительно, этот метод позволяет вам получить оценку только вашей собственной обработки; пока вы не ждали чужого ответа.

Это все, что у меня есть сейчас. И снова полный код.

Особая благодарность моему другу Adequin Renaud, с которым я весело размышлял над этой проблемой!