Легко сканировать байт-код для вызовов функций и ввести вызовы запуска/остановки таймера?
Или это действительно сложно, и именно поэтому люди платят за инструменты для этого?
Инъекционные вызовы достаточно трудны, чтобы инструменты были необходимы для этого.
Не только это сложно, это очень косвенный способ найти узкие места. Причина в том, что узким местом является одно или небольшое количество утверждений в вашем коде, которые отвечают за хороший процент времени, затрачиваемого на значительное время, что может быть значительно уменьшено - т. Е. Это действительно не необходимо, т. Е. Это расточительно. Если вы можете указать среднее время включения одной из ваших подпрограмм (включая время ввода-вывода), и ЕСЛИ вы можете умножить ее на сколько раз она была вызвана и делить на общее время, вы можете указать, в каком проценте времени рутина берет. Если процент небольшой (например, 10%), у вас, вероятно, больше проблем в другом месте. Если процент больше (например, от 20% до 99%), у вас может быть узкое место внутри процедуры. Итак, теперь у вас есть hunt внутри подпрограммы для этого, глядя на вещи, которые он называет, и сколько времени они принять. Также вы хотите избежать путаницы путем рекурсии (bugaboo графов вызовов).
Есть профайлеры (например, Zoom для Linux, Shark, & другие), которые работают по другому принципу. Принцип заключается в том, что существует стек вызовов функций, и в течение всего времени, за которое отвечает подпрограмма (либо выполняющая работу, либо ожидающая выполнения других подпрограмм, чтобы выполнить проделанную работу), это в стеке. Итак, если он отвечает за 50% времени (скажем), то это количество времени, которое он находится в стеке, независимо от того, сколько раз он был вызван, или сколько времени потребовалось за звонок. Не только процедура в стеке, но и конкретные строки кода, которые стоят времени, также находятся в стеке. Вам не нужно охотиться за ними. Другое дело, что вам не нужна точность измерения. Если вы взяли 10000 образцов стека, то виновные линии будут измеряться на уровне 50 +/- 0,5 процента. Если вы взяли 100 образцов, они будут измеряться как 50 +/- 5 процентов. Если вы взяли 10 образцов, они будут измеряться как 50 +/- 16 процентов. В каждом случае вы найдете их, и это ваша цель. (И рекурсия не имеет значения. Все это означает, что данная строка может появляться более одного раза в заданном образце образца.)
По этому вопросу есть много путаницы. Во всяком случае, профилировщики, которые наиболее эффективны для поиска узких мест, это те, которые пробуют стек, на настенные часы и сообщают процент за строкой. (Это легко увидеть, если определенный myths about profiling ставятся в перспективе.)
Я жду Jon тарелочкам. –
В этой статье много полезной информации: http://msdn.microsoft.com/en-us/magazine/cc301725.aspx. Также http://msdn.microsoft.com/en-us/library/bb384547.aspx –
Как правило, многие профилировщики принимают очень частые снимки стека, чтобы увидеть, где он находится сейчас. Затем они создают статистику, используя эти снимки. Конечно, есть очевидная возможность, что это не так с C#, поэтому возьмите это с солью. –