首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Linux 下批量计时中的问题(3)Shell下的批量计时

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下处理计时相对来说很简单,它是以牺牲计时精确性为代价的。相比之下,在语言中进行处理就显得要复杂得多,但精度更高。
返回列表