Linux 下批量计时中的问题(3)Shell下的批量计时
- UID
- 1066743
|
Linux 下批量计时中的问题(3)Shell下的批量计时
Shell下的批量计时 典型场景1:在某个目录下有一个可执行程序,它接受不同的输入参数。现在有要求在输入几百个不同参数的情况下,测试执行时间,并将结果写入文件中,每一个结果占用一行,以方便后续处理。
首先假设测试参数存储在一个输入文件"in.file"当中。
清单11. 文件in.file中的内容
1
2
3
4
| 1.00 2.00
1.50 2.76
1.80 3.30
……
|
现在的目标就是每次一行地读出文件中的参数,送给待测可执行程序,作为其执行参数,具体的代码段如下。
清单12. 测量不同参数的同一待测可执行程序在Linux下的运行时间
1
2
3
4
5
6
7
8
9
| #!bin/bash
while read line
do
i=`echo $line | cut -f1 -d" "`
j=`echo $line | cut -f2 -d" "`
(time foobar $i $j) 2>foo.tmp
grep real foo.tmp | cut -f2 >>foo.txt
done < "in.file"
rm -f foo.tmp
|
这里用的是Linux内置的time命令,当然也可以使用GNU的time命令(/usr/bin/time,精度要低一些)。cut命令里"-d"选项指定分隔符,分隔符默认是TAB。在待测可执行程序拥有多个参数的情况下,要使用多个变量来记录,cut命令里"-f"选项后面跟随的数字指定不同的域。再详细的说明可以参见作者的 前面一篇文章。
典型场景2:在某个目录下有好几百个可执行程序,要测试每一个可执行程序的运行时间,并将结果写入文件中,每一个可执行程序都要在文件中占用一行。
假定这些待测可执行程序都不需要指定输入参数,同时假定目录/home/developerworks/test/下的所有文件均为待测可执行文件。
清单13. 测量同一目录下所有的可执行程序在Linux下的运行时间
1
2
3
4
5
| for file in /home/developerworks/test/*
do
(time $file) 2>foo.tmp
grep real foo.tmp | cut -f2 >>foo.txt
done
|
time命令结果有三行组成:real、user和sys。我们这里用的都是real值,它表示从程序开始到程序执行结束时所消耗的时间,包括CPU的用时。CPU用时被划分为user和sys两块。user值表示程序本身,以及它所调用的库中的子例程使用的时间。sys是由程序直接或间接调用的系统调用执行的时间。
在单处理器上,real值和整个CPU用时之差,也就是real - ( user + sys )是所有延迟程序执行的因素的总和。在SMP上,这个值近似为real * number_of_processors - ( user + sys )。这些因素包括:
- 调入程序文本和数据的IO操作
- 获取程序实际使用内存的IO操作
- 由其它程序消耗的CPU用时
- 由操作系统消耗的CPU用时
- Shell下处理计时相对来说很简单,它是以牺牲计时精确性为代价的。相比之下,在语言中进行处理就显得要复杂得多,但精度更高。
|
|
|
|
|
|