профиль команды awk? - PullRequest
       19

профиль команды awk?

1 голос
/ 30 марта 2012

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

Есть ли способ для профилирования и команды awk? то есть. если он использует gsub, split, сортировку ассоциативных массивов, есть ли простой способ выяснить, какая часть перекрывает всю операцию?

РЕДАКТИРОВАТЬ: В частности, я ищу время выполнения для каждой подкоманды, а не сколько раз она была вызвана. это возможно?

Ответы [ 4 ]

2 голосов
/ 30 марта 2012

со страницы руководства gawk:

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

поэтому ответ будет положительным, если вы используете реализацию GNU.

И чтобы ответить на ваш следующий вопрос, на странице руководства будет написано

dgawk является отладчиком awk. Вместо непосредственного запуска программы загружает исходный код AWK, а затем запрашивает команды отладки. В отличие от gawk и pgawk, dgawk обрабатывает только исходный код программы AWK с опцией -f. Отладчик документирован в GAWK: эффективный AWK Программирование.

2 голосов
/ 31 марта 2012

Существует реализация awk с отладчиком, похожим на gdb, с именем dgawk .

Вы говорите, что хотите время выполнения для каждой подкоманды. Вот как я это делаю, независимо от языка:

Дайте ему достаточно рабочей нагрузки, чтобы он работал достаточно долго, и измерьте время часами (N секунд). Затем сделайте это снова, и пока он работает, нажмите Ctrl-C. Выполните обратную трассировку, чтобы проверить стек, и скопируйте его в текстовый редактор. Сделайте это несколько раз, например 10.

Любая подкоманда появится в стеке на долю времени, которое она проводит. Так что если sort занимает 50% времени (N / 2 секунды), оно появится примерно на 5 из этих выборок.

Это говорит вам о больших, а не маленьких. Я полагаю, вы ищете большие.

(Некоторые люди говорят, что это не точно, что является глупостью. Конечно, количество времени не очень точное - оно не должно быть. Точность, которая вам нужна, находится в местоположении - точно определяя, где проблема, и это то, что он делает.)

ДОБАВЛЕНО: Вы можете почти сделать это с помощью pgawk . Если вы запускаете свою программу в режиме профилирования, каждый раз, когда вы нажимаете Ctrl-C (или что-то еще), она печатает стек вызовов в выходной файл. Единственная проблема заключается в том, что он печатает имена функций, а не строки, из которых они вызываются, что вам может понадобиться.

1 голос
/ 31 марта 2012

Создайте профилирующую версию gawk для gprof или используйте основанный на ядре oprofile.Затем вы можете увидеть во многих деталях, сколько времени тратится на различные внутренние функции gawk в ответ на ваш скрипт и его данные.Такие функции, как gsub и split отображаются на функции внутри gawk.

Например, gsub и другие функции обрабатываются функцией do_sub в этом исходном файле:

http://git.savannah.gnu.org/cgit/gawk.git/tree/builtin.c

Таким образом, вы будете искать, сколько временитратится в do_sub.

Вы хотите скомпилировать и связать gawk с опцией -pg GCC.Успешные запуски программы затем выведут файл профилирования gmon.out, из которого gprof создаст отчет.

Я также настоятельно рекомендую oprofile, но для этого ответа я немного уйду за рамки.

1 голос
/ 30 марта 2012
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...