Как анализировать производительность файлов GNU Make - PullRequest
6 голосов
/ 24 августа 2011

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

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

Ответы [ 4 ]

5 голосов
/ 24 августа 2011

Я думаю, что я видел этот вопрос здесь раньше ...

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

Очень грубый пример: замените

make

на

make SHELL='echo $@: && time sh'

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

Например, попытаться выполнить что-то вроде

perl -0pe 's/([^:])\s*\n\t[@-]?/$1; /g' Makefile | make -f - SHELL='echo $@: && time sh'

это очень грубый удар в этом направлении.

Существуют различные альтернативные подходы, но я думаю, что единственное реальное решение - добавить эту функцию;GNU make написана на очень переносимом языке C, так что это не должно быть очень сложным.

1 голос
/ 21 мая 2017

Если вы пытаетесь профилировать статический Makefile, взгляните на make-profiler:

https://github.com/gojuno/make-profiler

Он действует как обертка вокруг make, которая предварительно обрабатывает Makefile, собирает журналы и рисует график вызовов с информацией о времени. Это особенно полезно, если вы создаете длительный конвейер обработки данных.

1 голос
/ 25 августа 2011

Нестандартное мышление: случайно ли вы тратите драгоценные электроны, используя рекурсивный make , т. Е. Где правила cd попадают в подкаталоги и снова вызывают make? Тогда это ваша проблема. Нерекурсивная сборка может быть быстрее на 2 порядка.

Подробнее см. Рекурсивное создание считается вредным

0 голосов
/ 18 августа 2014

Следующее поможет вам понять, как выполняется каждая команда и сколько раз из-за неправильно используемых переменных:,: =

make SHELL='/bin/sh -x'
...