Профилирование C++ в присутствии агрессивного встраивания?

Я пытаюсь выяснить, где моя программа C++ проводит свое время, с помощью gprof. Вот моя дилемма: если я компилирую с теми же настройками оптимизации, я использую для своей сборки конечных версий, в значительной степени все встраивается, и gprof говорит мне, бесполезно, что 90% моего времени потрачены в базовой стандартной программе, где все было встроено. С другой стороны, если я компилирую с отключенным встраиванием, прогоны программы порядок величины медленнее.

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

Я выполняю 64-разрядный Ubuntu 9.04 на четырехъядерной машине Intel. Я изучил google-perftools, но это, кажется, не работает хорошо над x86_64. Работа 32-разрядной машины не является опцией.

У кого-либо есть предложения относительно того, как я могу эффективнее представить свое приложение, когда встраивание включено?

Править: Вот некоторое разъяснение моей проблемы. Я приношу извинения, если это не было ясно первоначально.

Я хочу найти, где время проводилось в моем приложении. Профилирование моей оптимизированной сборки привело к gprof сообщение мне, что ~90% времени потрачен в основном, где все было встроено. Я уже знал что перед профилированием!

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

Короче говоря: существует ли способ получить полезную профильную информацию о программе C++, не отключая оптимизацию или встраивание?

18
задан Brad Larsen 20 January 2010 в 01:13
поделиться

6 ответов

SELECT
     TYP.id,
     TYP.name,
     TXT.comment
FROM
     dbo.Types TYP
INNER JOIN dbo.Type_Comments TXT ON
     TXT.type_id = TYP.id
WHERE
     NOT EXISTS
     (
          SELECT
               *
          FROM
               dbo.Type_Comments TXT2
          WHERE
               TXT2.type_id = TYP.id AND
               TXT2.created > TXT.created
     )

или:

SELECT
     TYP.id,
     TYP.name,
     TXT.comment
FROM
     dbo.Types TYP
INNER JOIN dbo.Type_Comments TXT ON
     TXT.type_id = TYP.id
LEFT OUTER JOIN dbo.Type_Comments TXT2 ON
     TXT2.type_id = TYP.id AND
     TXT2.created > TXT.created
WHERE
     TXT2.type_id IS NULL

в любом случае, если создаваемая дата может быть идентична между двумя строками с тем же Type_id, то вам нужно будет объяснить это.

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

-121--3894516-

Разработайте несколько макросов с использованием высокопроизводительного механизма производительности механизма вашего ЦП (например, x86 ) - процедуры, которые не полагаются на системные вызовы, а связывают Одиночная резьба, работающая в вашей основной цикле до определенного процессора ( установить аффинность ). Вам нужно будет реализовать следующие макрос.

PROF_INIT //allocate any variables -- probably a const char
PROF_START("name") // start a timer
PROF_STOP() // end a timer and calculate the difference -- 
            // which you write out using a async fd

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

Примечание:

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

- Редактировать -

Вы можете заинтересовать ссылку из этого ответа на один из моих вопросов .

2
ответ дан 30 November 2019 в 09:18
поделиться

Неважно, что код работает медленнее (ваш удобство, конечно) - Profiler все равно сообщит вам правильную долю времени, проведенного в каждой функции.

0
ответ дан 30 November 2019 в 09:18
поделиться

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

Вот довольно полное объяснение того, как это сделать.

Вы можете сделать это вручную, или использовать один из профайлеров, который может предоставить ту же самую информацию, например, oprofile и RotateRight/Zoom.

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

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

9
ответ дан 30 November 2019 в 09:18
поделиться

Вы можете использовать gcov для подсчета количества строк. Это должно, по крайней мере, указывать, какие внутренние функции являются узким местом.

0
ответ дан 30 November 2019 в 09:18
поделиться

Вы можете использовать более мощный профилировщик, такой как VTUNE Intel, который может дать вам уровень спектакля деталь.

http://software.intel.com/en-us/intel-vtune/

Это для Windows и Linux, но это стоит денег ...

2
ответ дан 30 November 2019 в 09:18
поделиться

Может ли valgrind быть более полезен?

В сочетании с графическим интерфейсом KCachegrind он предлагает бесплатный и простой способ просмотра аннотированного кода, подходящего для inlined-кода. Здесь у вас есть довольно простая инструкция: http://web.stanford.edu/class/cs107/guide_callgrind.html

2
ответ дан 30 November 2019 в 09:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: