Есть ли способ подсчитать количество выполненных инструкций IL? - PullRequest
4 голосов
/ 03 октября 2008

Я хочу провести некоторый бенчмаркинг процесса C #, но я не хочу использовать время в качестве своего вектора - я хочу подсчитать количество инструкций IL, которые выполняются в конкретном вызове метода. Возможно ли это?

Редактировать Я не имею в виду статический анализ тела метода - я имею в виду фактическое количество выполняемых инструкций - так что, если, например, тело метода включает цикл, количество будет увеличено, однако многие инструкции составляют цикл * количество итераций цикла.

Ответы [ 5 ]

4 голосов
/ 03 октября 2008

Не думаю, что можно делать то, что ты хочешь. Это связано с тем, что IL используется только во время компиляции JIT (Just-In-Time). Ко времени запуска метода IL был переведен в машинный код. Таким образом, хотя можно было бы подсчитать количество IL-инструкций в данном методе / типе / сборке статически, во время выполнения этого понятия не существует.

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

1 голос
/ 03 октября 2008

Вы можете использовать ICorDebug , который имеет управляемый интерфейс. Зафиксируйте точку останова в начале метода и программно выполняйте код, пока он не покинет метод.

Однако я не уверен, насколько полезной будет метрика, люди склонны тратить время на подобные вещи. Некоторые инструкции по IL более дороги, чем другие.

1 голос
/ 03 октября 2008

Ну, это будет нелегко. Я думаю вы могли бы оборудовать свою сборку после компиляции кодом счетчика производительности, который выполнялся после блоков IL. Например, если у вас был раздел метода, который загрузил int в стек, а затем выполнил статический метод с использованием этого int в оптимизированном коде, вы можете записать счетчик 2 для загрузки и вызова int.

Даже при использовании существующих проектов чтения / записи IL / управляемой сборки это было бы довольно сложной задачей.

Конечно, некоторые инструкции, записанные вашим счетчиком, могут быть оптимизированы во время компиляции точно в срок x86 / ia64 / x64, но это риск, который вы должны будете предпринять, чтобы попытаться профилировать на основе абстрактного языка. как IL.

0 голосов
/ 03 октября 2008

Я знаю, вам не нужен статический счет. Тем не менее, статический счетчик IL для каждой дуги плюс количество раз, когда дуга была выполнена вместе, дают счетчик IL. Для этого вам потребуется инструмент каждой дуги, который требует установки счетчика.

(Дуга - это последовательность инструкций, в которую вы не можете перейти или выйти. Если вы выполните первую инструкцию, вы всегда будете выполнять последнюю и т. Д.)

0 голосов
/ 03 октября 2008

Я использую Код метрики , добавляемый в Reflector

Надстройка CodeMetrics анализирует и вычисляет несколько показателей качества кода на ваших сборках. Эта надстройка использует Отражатель для вычисления классических метрик такие как цикломатическая сложность или более простые, такие как количество локальных переменных в методе. Все результаты могут быть сохранены в файл.

Установите плагин. Выберите сборку и метрики метода загрузки. Он покажет вам сетку с CodeSize, CyclomaticComplexity, # инструкции и т.д.

...