シェルスクリプトを分析する方法は?

シェルスクリプトを分析する方法は?

シェルスクリプトで複数のプログラムを実行しました。

./myprogram1
./myprogram2
...

ソースコードを編集して個々のプログラムのそれぞれをプロファイリングできることを知っていますが、スクリプト自体をプロファイリングして合計実行時間を測定する方法があるかどうかを知りたいです。この目的に使用できるタイマープログラムはありますか?それでは、測定値はどのくらい正確ですか?

答え1

まず、時間の使用についてJon Linのアドバイスに従ってください。

$ time ls test
test

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

スクリプトがどのUnixで実行されているかはわかりませんでしたが、Linuxでstraceを実行し、Solaris / AIXでtrussを実行すると、hp-uxのtuscがプロセスが何をしているかについて多くを伝えることができると思います。私は良い要約を得るために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

また、これらのトレースタイプのプログラムを添付すると、プログラムの速度が若干遅くなることがあります。

答え2

確認するtime注文する。これを使用して、実行にかかる時間と時間がかかる場所など、他の有用な情報を測定できます。

答え3

私はここに2回以上訪れたので、次の解決策を実装しました。

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|✔) $

答え4

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 -lpiを計算し、ループが単一のコマンドで実行されることをtime (...)保証します。for

関連情報