Как вы профилируете приложение .net с учетом эффекта кеша процессора? - PullRequest
0 голосов
/ 30 июля 2010

Все известные мне профилировщики .net не учитывают влияние кэша ЦП.

Учитывая, что чтение поля из кэша ЦП может быть на 100 быстрее, чем чтение из основной памяти, это может быть большим фактором.(Я просто должен был объяснить это в ответе )

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


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

В прошлом я обнаружил, что, сделав мои данные более компактными, они все поместятся в кэш ЦП, или изменение других данных, к которым осуществляется доступ, может иметь большой эффект.Например,

AccessArrarFromStartAndDoSomething()  
AccessArrayFromEndAndDoSomethingElse()

Лучше, чем

AccessArrarFromStartAndDoSomething()  
AccessArrayStartEndAndDoSomethingElse()

, если массив не помещается в кэш-память ЦП, но очень трудно найти этот тип инструментария.


Потратив больше циклов ЦП, чтобы уменьшить объем данных, чтобы они лучше помещались в кэш-память ЦП, можно распределить по многим системам, но большинство профилировщиков укажут вам в другом направлении.

Ответы [ 2 ]

0 голосов
/ 30 июля 2010

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

Некоторые профилировщики действительнохорош в такой ерунде.

Какова ваша общая цель?Вы хотите, чтобы вычисления выполнялись за меньшее время настенных часов?

Если нет, проигнорируйте этот ответ.

Если это так, вам нужно знать, что заставляет тратить время настенных часов на то, чтоВы можете избавиться от.

Речь идет не о точности времени.Речь идет о точности местоположения.Я полагаю, что вам действительно нужно знать, какие строки кода являются: 1) ответственными за разумную часть затраченного времени и 2) которые могут быть выполнены лучше или не выполнены вообще.Это то, что вам нужно знать, потому что, если нет таких строк кода, что вы собираетесь оптимизировать?

Отличный способ найти такие строки кода - это любой профилировщик, который 1) берет образцы, на настенные часы время (не процессорное время) стека вызовов и 2) говорит вам, для каждой строки кода (не функции), которая появляется настеки вызовов, на каких процентах стеков он отображается.Ваши строки кандидата на оптимизацию относятся к числу строк с большим процентом.(Пара примеров, отличных от .net: Zoom и LTProf .)

Честно говоря, профилировщик, который я использую, - это тот, который у вас уже есть.Я просто приостанавливаю программу, пока она работает медленно, и смотрю на стек.Мне не нужно много образцов.На самом деле, если есть строка кода, без которой я мог бы обойтись, если она появляется всего в двух выборках, я знаю, что это стоит исправить, и чем меньше выборок потребовалось, чтобы добраться до этой точки, тем большеэто. Вот более подробное объяснение.

Почти всегда существует множество "узких мест".Поэтому я нахожу большую, исправляю и делаю все снова.Исправление узкого места делает с остальными узкими местами - , оно делает их больше .Этот «эффект увеличения» позволяет вам продолжать движение до тех пор, пока не останется больше скорости, чтобы выжать.

0 голосов
/ 30 июля 2010

Возможно, я неправильно понимаю ваш вопрос, но я думаю, что ответ заключается в том, чтобы просто переключить ваш профилировщик в высокоточный режим с низкой детализацией.Примером может служить ANTS Performance Profiler новый режим сэмплирования:

http://www.simple -talk.com / community / blogs / andrewh / archive / 2009/11/13/76420.aspx

...