Как я могу профилировать сценарий оболочки?

10

У меня есть несколько программ, которые я выполняю в сценарии оболочки:

./myprogram1
./myprogram2
...

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

Павел
источник
Может быть, это будет полезно профилирование - Как профилировать сценарий оболочки Bash? - Переполнение стека -> stackoverflow.com/questions/5014823/…
Мохаммад Эфазати

Ответы:

10

Начните с использования времени согласно предложению Джона Линя:

$ time ls test
test

real    0m0.004s
user    0m0.002s
sys     0m0.002s

Вы не говорите, на каком Unix работают ваши скрипты, но следите за linux, связкой на Solaris / AIX, и я думаю, что tusc на hp-ux позволит вам многое узнать о том, что делает процесс. Мне нравится опция strace -c, чтобы получить хорошее резюме:

]$ strace -c ls
test
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 89.19    0.000998         998         1           execve
 10.81    0.000121         121         1           write
  0.00    0.000000           0        12           read
  0.00    0.000000           0        93        79 open
  0.00    0.000000           0        16           close
  0.00    0.000000           0         2         1 access
  0.00    0.000000           0         3           brk
  0.00    0.000000           0         2           ioctl
  0.00    0.000000           0         4           munmap
  0.00    0.000000           0         1           uname
  0.00    0.000000           0         6           mprotect
  0.00    0.000000           0         2           rt_sigaction
  0.00    0.000000           0         1           rt_sigprocmask
  0.00    0.000000           0         1           getrlimit
  0.00    0.000000           0        30           mmap2
  0.00    0.000000           0         8         7 stat64
  0.00    0.000000           0        13           fstat64
  0.00    0.000000           0         2           getdents64
  0.00    0.000000           0         1           fcntl64
  0.00    0.000000           0         1           futex
  0.00    0.000000           0         1           set_thread_area
  0.00    0.000000           0         1           set_tid_address
  0.00    0.000000           0         1           set_robust_list
  0.00    0.000000           0         1           socket
  0.00    0.000000           0         1         1 connect
------ ----------- ----------- --------- --------- ----------------
100.00    0.001119                   205        88 total

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

Davey
источник
На самом деле, я в основном использую Redhat, но в эти дни я тоже начинаю чаще использовать Debian (ubuntu).
Пол
4

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

Джон Лин
источник
2

Это не совсем профилирование, но вы можете отследить ваш скрипт во время его работы. Поставьте set -xvперед разделом, который вы хотите отслеживать, и set +xvпосле раздела. set -xвключает xtrace, который покажет каждую строку, которая выполняется. set -vвключает подробный режим, который также показывает строки, которые могут оказывать влияние, но не выполняются, например, назначение переменных.

Вы также можете поставить метку времени. Вы нуждаетесь в эмуляторе терминала, который может пометить время каждой строкой Единственный, кого я знаю, это RealTerm , программа для Windows, но она будет работать с Wine. Вы также можете использовать grabserial, хотя я не пробовал, кроме как с реальными последовательными портами. Вы можете узнать, какое последовательное устройство использует ваша оболочка, запустив ps -p $$(если это не так, используйте, manчтобы узнать, как включить столбец TTY в ваш psвывод).

Также см. Инструменты профилирования производительности для сценариев оболочки в Stack Overflow.

Шон Дж. Гофф
источник
2

time за несколько итераций

Профилирование, выполнив одну и ту же команду несколько раз

time (for ((n=0;n<10;n++)); do echo "scale=1000; 4*a(1)" | bc -l; done)

Где echo "scale=1000; 4*a(1)" | bc -lвычисляет число pi и time (...)гарантирует, что forцикл выполняется как одна команда.

Антон Тарасенко
источник
1

Поскольку я оказался здесь хотя бы дважды, я реализовал решение:

https://github.com/walles/shellprof

Он запускает ваш сценарий, прозрачно синхронизирует все напечатанные строки и в конце выводит список из 10 лучших строк, которые были на экране самыми длинными:

~/s/shellprof (master|✔) $ ./shellprof ./testcase.sh
quick
slow
quick

Timings for printed lines:
1.01s: slow
0.00s: <<<PROGRAM START>>>
0.00s: quick
0.00s: quick
~/s/shellprof (master|✔) $
Йохан Уоллес
источник