В этом бизнесе существуют определенные общепринятые убеждения, которые я бы посоветовал вам внимательно изучить.
Одним из них является то, что лучший (если не единственный) способ найти проблемы с производительностью - это измерить время, которое занимает каждая подпрограмма, и подсчитать, сколько раз она вызывается.
Это сверху вниз. Это связано с верой в то, что лес важнее деревьев. Он основан на мифах о «скорости кода» и «узких местах». Это не очень научно.
Проблема с производительностью больше похожа на ошибку, чем на количественную. То, что он делает неправильно, это тратит время , и это нужно исправить. Он основан на простом наблюдении:
Медлительность состоит из времени, потраченного по плохим причинам.
Чтобы найти его, произведите выборку состояния программы в случайных промежутках времени и выясните их причины.
Если что-то вызывает медлительность, то один этот факт выставляет это вашим образцам. Так что, если вы берете достаточно образцов, вы увидите это. Вы будете приблизительно знать, сколько времени это будет стоить вам, по доле образцов, которые это показывают.
Хороший способ узнать, тратится ли время на небольшую вескую причину, - внимательно посмотреть на стек вызовов. У каждого вызова функции в стеке есть неявная причина, и если какая-либо из этих причин плохая, то причина для всей выборки плохая.
Некоторые профилировщики говорят вам, на уровне выписки, сколько стоит каждое утверждение.
Лично я просто несколько раз случайно останавливал программу. Любые вызовы, обнаруженные на нескольких образцах, являются вероятными кандидатами на подозрение. Это никогда не подводит.
Вы можете сказать: «Это не точно». Это очень точно. Он точно определяет инструкции, вызывающие проблему. Это не дает вам 3 десятичных знака точности синхронизации. То есть это мерзко для измерения, но превосходно для диагностики.
Вы можете сказать: «А как насчет рекурсии?». Ну что на счет этого?
Вы можете сказать: «Я думаю, что это может работать только на игрушечных программах». Это было бы просто желание. На самом деле большие программы, как правило, имеют больше проблем с производительностью, потому что у них более глубокие стеки, что дает больше возможностей для вызовов по плохим причинам, и выборка находит их просто отлично, спасибо.
Извините, что я обманщик. Я просто не хочу видеть мифы в том, что должно быть научно обоснованным.
MORE