Как я могу профилировать код C ++, работающий в Linux?

Доступ к текущему событию можно получить через window.event. Просто использование event подразумевает доступ к window.event.

1667
задан codeforester 2 June 2018 в 16:31
поделиться

6 ответов

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

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

Просто останов это несколько раз и каждый раз смотрит на стек вызовов. Если существует некоторый код, который тратит впустую некоторый процент времени, 20% или 50% или что бы то ни было, который является вероятностью, что Вы застанете его на месте на каждом образце. Таким образом, это - примерно процент образцов, на которых Вы будете видеть его. Нет никаких образованных требуемых догадок. Если у Вас действительно будет предположение относительно того, какова проблема, это докажет или опровергнет ее.

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

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

  1. они не подводят итог на уровне инструкции, и
  2. они дают запутывающие сводки в присутствии рекурсии.

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

P.S. Это может также быть сделано на программах мультипотока, если существует способ собрать образцы стека вызовов пула потоков в моменте времени, поскольку существует в Java.

P.P.S Как грубая общность, чем больше слоев из абстракции Вы имеете в своем программном обеспечении, тем более вероятно необходимо найти, что это - причина проблем производительности (и возможность получить ускорение).

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

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

ДОБАВИЛ: Позвольте мне сделать Байесовское объяснение того, как оно работает. Предположим, что существует некоторая инструкция I (вызов или иначе), который находится на стеке вызовов некоторая часть f из времени (и таким образом стоит так многого). Для простоты предположите, что мы не знаем, какой f, но предположите, что это любой 0.1, 0.2, 0.3... 0.9, 1.0, и априорная вероятность каждой из этих возможностей 0.1, таким образом, все эти затраты являются, одинаково вероятно, априорными.

Тогда предполагают, что мы берем всего 2 образца стека, и мы видим инструкцию I на обоих образцах, обозначенном наблюдении o=2/2. Это дает нам новые оценки частоты f из I, согласно этому:

Prior                                    
P(f=x) x  P(o=2/2|f=x) P(o=2/2&&f=x)  P(o=2/2&&f >= x)  P(f >= x | o=2/2)

0.1    1     1             0.1          0.1            0.25974026
0.1    0.9   0.81          0.081        0.181          0.47012987
0.1    0.8   0.64          0.064        0.245          0.636363636
0.1    0.7   0.49          0.049        0.294          0.763636364
0.1    0.6   0.36          0.036        0.33           0.857142857
0.1    0.5   0.25          0.025        0.355          0.922077922
0.1    0.4   0.16          0.016        0.371          0.963636364
0.1    0.3   0.09          0.009        0.38           0.987012987
0.1    0.2   0.04          0.004        0.384          0.997402597
0.1    0.1   0.01          0.001        0.385          1

                  P(o=2/2) 0.385                

в последнем столбце говорится, что, например, вероятность, которая f> = 0.5 составляет 92%, от предшествующего предположения о 60%.

предположим предшествующие предположения отличаются. Предположим, что мы предполагаем, что P (f=0.1).991 (почти бесспорный), и все другие возможности почти невозможны (0.001). Другими словами, наша предшествующая уверенность состоит в том, что I является дешевым. Тогда мы добираемся:

Prior                                    
P(f=x) x  P(o=2/2|f=x) P(o=2/2&& f=x)  P(o=2/2&&f >= x)  P(f >= x | o=2/2)

0.001  1    1              0.001        0.001          0.072727273
0.001  0.9  0.81           0.00081      0.00181        0.131636364
0.001  0.8  0.64           0.00064      0.00245        0.178181818
0.001  0.7  0.49           0.00049      0.00294        0.213818182
0.001  0.6  0.36           0.00036      0.0033         0.24
0.001  0.5  0.25           0.00025      0.00355        0.258181818
0.001  0.4  0.16           0.00016      0.00371        0.269818182
0.001  0.3  0.09           0.00009      0.0038         0.276363636
0.001  0.2  0.04           0.00004      0.00384        0.279272727
0.991  0.1  0.01           0.00991      0.01375        1

                  P(o=2/2) 0.01375                

Теперь это говорит, что P (f> = 0.5) составляет 26%, от предшествующего предположения 0,6%. Таким образом Байесов позволяет нам обновлять нашу оценку вероятной стоимости [1 111]. Если объем данных является небольшим, он не говорит нам точно, какова стоимость, только что это является достаточно большим, чтобы стоить зафиксировать.

еще один способ посмотреть на него называют Правило наследования . Если Вы зеркально отражаете монету 2 раза, и она подходит, направляется оба раза, что это говорит Вам о вероятном взвешивании монеты? Уважаемый способ ответить состоит в том, чтобы сказать, что это - Бета распределение со средним значением (количество хитов + 1) / (количество попыток + 2) = (2+1) / (2+2) = 75%.

(Ключ - то, что мы видим I несколько раз. Если мы только видим его однажды, который не говорит нам очень за исключением того, что f> 0.)

Так, даже очень небольшое количество образцов может сказать нам много о стоимости инструкций, что это видит. (И это будет видеть их с частотой, в среднем, пропорциональный их стоимости. Если n образцы будут взяты, и f стоимость, то I появится на [1 117] образцы. Пример, n=10, f=0.3, который является 3+/-1.4 образцы.)

<час>

ДОБАВЛЕННЫЙ, для предоставления интуитивного чувства для различия между измерением и случайной выборкой стека:
существуют профилировщики теперь, когда образец, стек, даже на тактовом стеной времени, но , что выходит , является измерениями (или горячий путь или горячая точка, от которой "узкое место" может легко скрыться). Что они не показывают Вам (и они легко могли) быть самими фактическими образцами. И если Ваша цель к [1 128], находят узкое место, количество их, которых необходимо видеть, [в среднем 1 129], 2 разделенных частью времени, которое требуется. Таким образом, если потребуется 30% времени, 2/.3 =, то 6,7 образцов, в среднем, покажут его, и шанс, что 20 образцов покажут, что это - 99,2%.

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

enter image description here

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

1317
ответ дан 24 revs, 3 users 94% 2 June 2018 в 16:31
поделиться
  • 1
    это должно быть кодировано как: s.keep_alive = Ложь – DjangoRocks 7 April 2013 в 15:00

Я предполагаю, что Вы используете GCC. Стандартное решение состояло бы в том, чтобы представить с gprof.

убедиться добавить -pg к компиляции перед профилированием:

cc -o myprog myprog.c utils.c -g -pg

я еще не попробовал его, но я услышал хорошие вещи приблизительно google-perftools . Это определенно стоит попытки.

Связанный вопрос здесь .

Несколько других модных словечек, если gprof не делает задания для Вас: Valgrind, Intel VTune, Sun DTrace.

332
ответ дан try-catch-finally 3 June 2018 в 02:31
поделиться
  • 1
    Спасибо. действительно Вы сэкономили мое время:) – Erhan Demirci 29 March 2014 в 19:49

Вы можете использовать Valgrind со следующими параметрами

valgrind --tool=callgrind ./(Your binary)

. Он создаст файл с именем callgrind.out.x . Затем вы можете использовать инструмент kcachegrind для чтения этого файла. Это даст вам графический анализ вещей с результатами, например, какие строки стоят сколько.

554
ответ дан 22 November 2019 в 20:10
поделиться

На самом деле немного удивленный не многие упомянули приблизительно Google/сравнительный тест , в то время как это является немного громоздким для прикрепления определенной области кода, особенно если кодовая база является немного большой, однако я нашел это действительно полезным при использовании в сочетании с callgrind

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

  1. является моим корректным алгоритмом?
  2. там блокировки, которые оказываются горлышками бутылки?
  3. там определенный раздел кода, это оказывается преступником?
  4. как насчет IO, обработанного и оптимизированного?

valgrind с комбинацией callrind и kcachegrind должен обеспечить достойную оценку на точках выше и после того как она устанавливается, что существуют проблемы с некоторым разделом кода, я предложил бы, делают микро точка отсчета google benchmark является хорошим местом для запуска.

0
ответ дан 22 November 2019 в 20:10
поделиться

Я бы использовал Valgrind и Callgrind в качестве основы для своего набора инструментов профилирования. Важно знать, что Valgrind - это, по сути, виртуальная машина:

(wikipedia) Valgrind, по сути, виртуальная машина, использующая точно в срок (JIT) методы компиляции, включая динамическая перекомпиляция. Ничего из исходная программа когда-либо запускается непосредственно на главном процессоре. Вместо этого Valgrind сначала переводит программу во временную, более простую форму называется промежуточным представлением (IR), который не зависит от процессора, Форма на основе SSA. После преобразования инструмент (см. ниже) можно делать бесплатно какие бы преобразования он ни хотел на IR, прежде чем Valgrind переведет IR обратно в машинный код и позволяет хост-процессор запускает его.

Callgrind - это профилировщик, построенный на этом. Главное преимущество в том, что вам не нужно запускать приложение часами, чтобы получить надежный результат. Даже одной секунды запуска достаточно, чтобы получить надежные результаты, потому что Callgrind является профилировщиком без зондирования .

Еще один инструмент, построенный на Valgrind, - Massif. Я использую его для профилирования использования памяти кучи. Отлично работает. Что он делает, так это то, что он дает вам снимки использования памяти - подробную информацию, ЧТО занимает КАКОЙ процент памяти, и КТО поместил ее туда. Такая информация доступна в разные моменты времени работы приложения.

72
ответ дан 22 November 2019 в 20:10
поделиться

Новые ядра (например, последние ядра Ubuntu) поставляются с новыми инструментами 'perf' ( apt-get install linux-tools ) AKA perf_events .

К ним прилагаются классические профилировщики выборки ( справочная страница ), а также потрясающая временная диаграмма !

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

Alt text

247
ответ дан 22 November 2019 в 20:10
поделиться
Другие вопросы по тегам:

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