Есть ли способ подсчитать количество выполненных инструкций IL?

StackOverflow https://stackoverflow.com/questions/165809

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

Я использую метрики кода , добавленные в Отражатель

  

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top