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

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

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

Почему ты не хочешь использовать время? Или скажите счетчик тиков таймера с высоким разрешением? Как указали несколько человек, не все инструкции IL одинаковы по сложности.

Mitch Wheat 03.10.2008 11:14

Потому что меня больше интересует количество выполненных инструкций, чем время их выполнения.

Erik Forbes 03.10.2008 11:28

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

hwiechers 03.10.2008 17:37

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

Erik Forbes 03.10.2008 19:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
4
1 683
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

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

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

Соответствуют ли существующие проекты / фреймворки этой задаче?

Erik Forbes 03.10.2008 10:25

Не знаю ничего, что делает то, что вам нужно. Я редактировал IL путем циклического переключения сборок C# с помощью ILDASM / ILASM, и я знаю, что проект PostSharp имеет посткомпилированное переплетение IL - и в качестве OSS было бы неплохо посмотреть, как кто-то уже решил проблему: postsharp.org

ZeroBugBounce 03.10.2008 10:37

вау пост острый классный ... давно искал что-то подобное

Sam Saffron 03.10.2008 11:46

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

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

Ммм, отличная идея - я даже не рассматривал возможность использования существующих интерфейсов отладки ... И вы правы - инструкции IL имеют разную стоимость - но теоретически с таким подходом я мог бы рассчитать время для каждой индивидуально, когда отладчик прошел через них. Спасибо, я попробую! знак равно

Erik Forbes 03.10.2008 10:32

Если подумать, я не знаю, будет ли это моим решением - мне пришлось бы запускать код, который я хочу проанализировать, в отдельном процессе. Это вносит большую сложность в процесс написания анализируемого кода, и я не хочу раскрывать эту сложность. Хм...

Erik Forbes 03.10.2008 11:08

Я использую надстройку Показатели кода в Reflector

The CodeMetrics add-in analyses and computes several code quality metrics on your assemblies. This add-in uses Reflector to compute classic metrics such as cyclomatic complexity or more straightforward ones such as the number of local variables in a method. All results can be saved to a file.

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

Мех, я имею в виду выполняемые инструкции во время выполнения, а не статический анализ метода.

Erik Forbes 03.10.2008 11:27
Ответ принят как подходящий

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

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

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

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

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