Первое, что я говорю людям, - это признать разницу между
1) синхронизация подпрограмм и подсчет количества их вызовов и
2) поиск кода, который вы можете плодотворно оптимизировать.
Для (1) существуют профилировщики инструментов.
Чтобы быть действительно успешным в (2), вам нужен редкий тип профилировщика.
Вам нужен профилировщик выборки, который
выборка всего стека вызовов, а не только счетчик программы
выборок в произвольные часы настенного времени, а не только на ЦП, для выявления возможных проблем ввода-вывода
выборки, когда вы этого хотите (не при ожидании ввода пользователя)
для вывода дает для каждой строки кода, которая появляется в выборках стека , процентов выборок, содержащих эту строку . Это прямая мера общего времени, которое можно было бы сэкономить, если бы этой строки не было.
(на самом деле я делаю это вручную, прерывая программу под отладчиком.)
Не отвлекайтесь на проблемы, которых у вас нет, такие как
точность измерения. Если строка кода появляется на 30% образцов стека вызовов, ее фактическая стоимость может быть где-то в диапазоне около 30%. Если вы сможете найти способ устранить его или вызвать его гораздо меньше, вы сэкономите его стоимость, даже если заранее не знаете точно, какова его стоимость.
эффективность отбора проб. Поскольку вам не нужна точность измерения времени, вам не нужно большое количество образцов. Даже если вы получаете большое количество образцов, они не сильно искажают результаты, потому что они не могут обнаружить дорогостоящие строки кода.
графы вызовов. Они делают хорошую графику, но это не то, что вам нужно знать. Дуга на графе вызовов соответствует строке кода в лучшем случае, обычно это несколько строк, поэтому знание стоимости дуги говорит только о стоимости линии в лучшем случае. Графики вызовов концентрируются на функциях, когда вам нужно найти строки кода. Графы вызовов запутываются в проблеме рекурсии, которая не имеет значения .
Важно понимать, чего ожидать. Многие программисты, используя традиционные профилировщики, могут получить улучшение на 20%, считают это потрясающим, считают профилировщик победителем и на этом останавливаются. Другие, работающие с большими программами, часто могут получить коэффициенты ускорения в 20 раз .
Это делается путем исправления серии проблем , каждая из которых дает мультипликативный коэффициент ускорения. Как только профилировщик не может найти следующую проблему, процесс останавливается. Вот почему «достаточно хорошо» не достаточно хорошо.
Вот краткое объяснение метода.