如何分析 shell 脚本?

如何分析 shell 脚本?

我有几个在 shell 脚本中执行的程序:

./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

由于我已经在这里至少两次了,所以我实施了一个解决方案:

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 -l计算 pi 并time (...)确保for循环作为单个命令运行。

相关内容