我有几个在 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
循环作为单个命令运行。