2010-09-14 4 views
5

Профилировщики, с которыми я сталкиваюсь (в основном, с профилировщиком Digital Mars D, который приходит с компилятором), значительно замедляют выполнение профилируемой программы. Это сильно влияет на мою готовность использовать профилировщик, поскольку он делает профилирование «реального» запуска многих моих программ, в отличие от тестирования на очень небольшом входе, непрактичным. Я не очень разбираюсь в том, как применяются профилировщики. Является ли серьезное (> 2x) замедление при профилировании в значительной степени факта жизни, или есть профилировщики, которые его избегают? Если этого можно избежать, есть ли какие-либо быстрые профилировщики для D, предпочтительнее для D2 и, желательно, бесплатно?Выполняют ли все профилиляторы медленное выполнение?

ответ

15

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

Первый - с помощью инструментария, путем инъекции протоколов вызовов по всему месту. Это замедляет приложение более или менее. Как правило, больше.

Вторая выборка. Затем профилировщик прерывает приложение через регулярные промежутки времени и проверяет стек вызовов. Это совсем не замедляет работу приложения.

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

Проверьте документацию для вашего профилировщика, если вы можете выполнять выборку вместо инструментария. В противном случае у вас есть несколько новых терминов Google в «выборке» и «настройке».

+0

++ Да, правила отбора проб! Но не только старая выборка. Сэмплирование стека вызовов по времени настенных часов и составление отчетов по строке (не функции) процента образцов, содержащих эту строку. И дополнительные детали, которые вы получаете с помощью инструментария, - это все равно шум, если ваша цель - найти код, нуждающийся в оптимизации. –

+0

По этой причине я предпочитаю использовать пробоотборники пробоотбора везде, где это практически возможно - они, как правило, предоставляют множество надежных данных для относительно небольших затрат по производительности, и я могу запустить его в течение длительного времени, чтобы усреднить результаты из стохастического, шумного процесса (как функция, которая занимает 1 миллион 90% времени, когда она называется, а 500 мс - 10%). – Crashworks

+0

Я нахожу точный счетчик функций, который время от времени полезны инструментальные профилографы. Если я загружаю 120 клиентов в список, я смотрю функции, которые называются 120 (и хуже n x 120) раз. Затем я могу найти функции, вызванные ошибкой (т. Е. Вызванные событием). Или звонки, сделанные для каждого пункта, где один звонок для всех из них должен быть достаточным. –

1

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

+1

многие пробоотборники выборки могут масштабировать, как часто они берут свои образцы. Это позволяет накладные расходы значительно меньше, чем профилирование инструментария (порядка 1-5%). Разумеется, качество данных зависит от частоты дискретизации. Обе формы профилирования имеют ненулевой эффект, но выборка значительно меньше. –

1

Вы можете попробовать h3r3tic's xfProf, который является профилировщиком пробоотбора. Не пробовал сам, но этот парень всегда делает интересные вещи :)

Из описания:

Если программа оцифровывается только несколько сотен (или тысяч) раз в секунду, производительность накладные расходы не будут заметны.

+0

Спасибо. Это должно быть улучшением (еще не проверял его), хотя он по-прежнему говорит, что вам нужно скомпилировать без оптимизаций, который, вероятно, имеет более чем 2x perf. Стоимость. – dsimcha

+0

@dsimcha: @torhu: Я только что проверил сайт xfProf. Мне грустно. Он построен на тех же принципах, что и gprof. Вот почему мне грустно: http://stackoverflow.com/questions/1777556/alternatives-to-gprof/1779343#1779343 –

2

My favorite method of profiling замедляет программу путь путь вниз, и это нормально. Я запускаю программу под отладчиком с реалистичной загрузкой, а затем вручную ее прерываю. Затем я копирую стек вызовов где-то, как в Блокнот. Таким образом, для сбора одного образца требуется порядка минут. Затем я могу либо возобновить выполнение, либо даже нормально начать его с самого начала, чтобы получить еще один образец.

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

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

Под «активностью» я не обязательно имею в виду, где компьютер зависает. В реалистичном программном обеспечении ПК практически всегда отключается в системной или библиотечной программе. Как правило, важнее сайты звонков в нашем коде. Если я вижу, например, последовательность из трех вызовов, отображаемых на половине выборок стека, которая представляет собой очень хорошую охоту, потому что, если какой-либо из них действительно не нужен и может быть устранен, время выполнения будет уменьшаться на половина.

Если вы хотите усмехаться менеджером, просто сделайте это один или два раза.

Даже в том, что вы считаете математическим тяжелым научным номером, хрустят приложения, где вы думаете, что оптимизация на низком уровне и горячие точки будут править днем, вы знаете, что я часто нахожу? Подпрограммы математической библиотеки: проверка аргументов, а не хруст. Часто код не делает то, что, по вашему мнению, он делает, и вам не нужно запускать его на максимальной скорости, чтобы это выяснить.

+0

Менее полезно, когда у вас довольно плоский профиль, где ни один компонент не занимает более 2% времени выполнения сам по себе, но вам нужно как-то получить свой основной цикл от 40 мс до 33 мс, установив пятьдесят мелочей. Но это довольно специализированный случай. – Crashworks

+0

Также вам стоит взглянуть на современные пробоотборники. Я продолжаю рекомендовать их вам не потому, что я думаю, что ваш метод плох, а потому, что я полностью согласен с вашим подходом и рад, что есть автоматические инструменты, которые могут делать это 1000 выборок в секунду. – Crashworks

+0

@Crashworks: Спасибо. Мой опыт заключается в том, что вы только добираетесь до того, что будете иметь маленькие мелочи для оптимизации после того, как вы избавитесь от некоторых довольно массивных вещей, о которых вы никогда не догадывались. Что касается инструментов, я думаю, что Zoom и LTProf имеют правильную идею, но, как я пытался объяснить раньше, вам не нужно большое количество образцов, если ваши самые большие проблемы действительно очень малы. Кроме того, я не знаю никакого инструмента, который позволяет вам подробно изучить образец типичного стека и контекст программы, действующий на момент его принятия. Это дает вам представление о том, что цифры не могут. –

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