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





Что ж, это будет непросто. В считать вы можете оснастить свою сборку после компиляции кодом счетчика производительности, который выполняется после блоков IL. Например, если у вас есть раздел метода, который загружает int в стек, а затем выполняет статический метод с использованием этого int в оптимизированном коде, вы можете записать счетчик 2 для загрузки и вызова int.
Даже при использовании существующих проектов чтения / записи сборок, управляемых IL / управляемых сборок, это было бы довольно сложной задачей.
Конечно, некоторые инструкции, записанные вашим счетчиком, могут быть оптимизированы во время своевременной компиляции в x86 / ia64 / x64, но это риск, который вам придется принять, чтобы попытаться профилировать на основе абстрактного языка, такого как IL.
Соответствуют ли существующие проекты / фреймворки этой задаче?
Не знаю ничего, что делает то, что вам нужно. Я редактировал IL путем циклического переключения сборок C# с помощью ILDASM / ILASM, и я знаю, что проект PostSharp имеет посткомпилированное переплетение IL - и в качестве OSS было бы неплохо посмотреть, как кто-то уже решил проблему: postsharp.org
вау пост острый классный ... давно искал что-то подобное
Вы можете использовать ICorDebug с управляемым интерфейсом. Установите точку останова в начале метода и программно выполните код, пока он не выйдет из метода.
Однако я не уверен, насколько полезной будет эта метрика, люди склонны тратить время на такие вещи. Некоторые инструкции IL дороже других.
Ммм, отличная идея - я даже не рассматривал возможность использования существующих интерфейсов отладки ... И вы правы - инструкции IL имеют разную стоимость - но теоретически с таким подходом я мог бы рассчитать время для каждой индивидуально, когда отладчик прошел через них. Спасибо, я попробую! знак равно
Если подумать, я не знаю, будет ли это моим решением - мне пришлось бы запускать код, который я хочу проанализировать, в отдельном процессе. Это вносит большую сложность в процесс написания анализируемого кода, и я не хочу раскрывать эту сложность. Хм...
Я использую надстройку Показатели кода в 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 и т. д.
Мех, я имею в виду выполняемые инструкции во время выполнения, а не статический анализ метода.
Не думаю, что можно делать то, что ты хочешь. Это связано с тем, что IL используется только во время JIT (Just-In-Time) компиляции. К моменту запуска метода IL был переведен в собственный машинный код. Таким образом, хотя можно было подсчитать количество инструкций IL в данном методе / типе / сборке статически, во время выполнения этого понятия не существует.
Вы не заявили о своем намерении, зная количество инструкций IL, которые будут интерпретироваться. Учитывая, что существует лишь слабая корреляция между подсчетом IL тела метода и фактическим количеством инструкций машинного кода, я не вижу, чего можно достичь, зная это число (кроме удовлетворения вашего любопытства).
Я знаю, что вам не нужен статический счет. Однако статический подсчет IL на дугу плюс количество раз, когда дуга выполнялась вместе, дает вам количество IL. Для этого вам нужно будет оснастить каждую дугу инструментами, что потребует установки счетчика.
(Дуга - это последовательность инструкций, в которую вы не можете прыгнуть или выйти. Если вы выполняете первую инструкцию, вы всегда выполняете последнюю и т. д.)
Почему ты не хочешь использовать время? Или скажите счетчик тиков таймера с высоким разрешением? Как указали несколько человек, не все инструкции IL одинаковы по сложности.