1

Каковы эффекты запуска, скажем, профилировщика Visual Studio 2010, на производительность моей программы? То есть, каким образом результаты от профилировщика фактически неточны из-за того, как профилировщик должен «вмешиваться» в нормальную работу программы для проверки производительности? Или есть такие проблемы?Влияние самого профилировщика на измерение производительности в .Net

Этот вопрос связан с тем фактом, что я вижу, что свойство получает/устанавливает свойство как занимающее значительное количество времени в моих методах в профилировщике Visual Studio 2010 (я программирую на C#). Эти свойства являются теми, которые автоматически генерируются в словаре ресурсов .resx (избегая магических строк :-)), и поэтому я хотел бы принять, что компилятор JIT и/или интерпретатор, работающий за кулисами , как правило, ввел их если бы это было полезно. Я бы предположил, что такая инкрустация не возникает, когда вы запускаете профилировщик ... Или это так?

Я специально работаю с профилировщиком Visual Studio 2010, но я был бы признателен за ответ, который включает в себя другие профилировщики.

Извините, если я упустил вопрос, который отвечает на это уже, не стесняйтесь указывать путь.

+0

Свойства действительно дороги и занимают около 80 раз больше времени, чем открытые поля. Также кажется, что они не оптимизированы (даже не nGen). В областях, где наследование и совместимость не играют никакой роли, я часто использую публичные поля вместо свойств для повышения производительности (если команда позволяет это, некоторые разработчики получают религиозную информацию об этом «грехе»). У меня есть подозрение, что свойства действительно оптимизируются в виртуальных машинах с технологией Hyper-V. Как-то на виртуальной машине ситуация значительно улучшается по сравнению с сухой OS-установкой на одном и том же оборудовании. –

+0

Я думаю, это зависит от свойства: http://www.dotnetperls.com/property. Некоторые из них, по-видимому, оптимизированы. Но похоже, что в качестве вывода к тому, что сказал @Cydermaxs, эта аппаратура может очень хорошо предотвратить оптимизацию свойств, просто путем измерения их скорости.То же самое может произойти для выборки, но на данный момент это неуверенно. – skybluecodeflier

+0

IMHO (и, увидев ответ ниже), использование таймера для сравнения оптимизированного кода с оптимизированным кодом будет работать для определения того, будут ли свойства или поля быстрее в вашем конкретном экземпляре. – skybluecodeflier

ответ

1

С моей точки зрения, это зависит ...

Как вы знаете, есть много режимов профилирования. Для профилирования CPU/time, trere - выборка и контрольно-измерительные приборы.

Профилирование профилей является более «статистическим» профилированием. Точность результатов зависит от количества раз, которое код выполняет во время сеанса профилирования. Через равные промежутки времени Profiler делает снимок стека вызовов каждого потока, выполняющего на целевом процессе (процессах). Если метод имеет огромное количество выборок, это может быть из-за большого выполнения или длительного выполнения метода. Он очень легкий и имеет минимальное воздействие на систему и прост в использовании.

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

Последнее, что нужно понять, это то, что Profiling можно рассматривать как научный подход, потому что вы должны измерить свой код в реальных условиях (или реальных случаях использования), чтобы точно определить, где узкие места и исправить их, зная, что это улучшит представление.

+0

Просто, чтобы уточнить, для профилирования выборки, то, что именно подсчитывается? Количество строк кода выполнено? Сколько раз профайлер ловит код, выполняющий конкретный метод? Сколько раз вы вызываете метод? Это не ясно мне в документации VS. – skybluecodeflier

+0

Как я уже говорил, каждые 10 миллионов тактовых циклов (по умолчанию), Profiler принимает моментальный снимок * стека вызовов * каждого выполняемого потока. Это не интрузивно (без зондов). Его можно рассматривать как статистический анализ многих стеков вызовов. Существует также различие между инклюзивным (образцы, включая время, проведенное в функции, вызванной из этой функции) или эксклюзивное (выборки, исключая время, потраченное на функции, вызванные этой функцией. – Cybermaxs

+0

Спасибо за разъяснение - я получаю его сейчас. ответы. – skybluecodeflier

Смежные вопросы