一个 Shell 程序的性能优化
2009-06-30 04:50:00 来源:WEB开发网核心提示: 解决方法2:将内层循环的逐个比较的方法改为二分查找法进行判断,程序代码如下:#!/bin/bash#Author Xsh date:08-15-2006#程序中使用了二分查找法进行号码的范围判断#为突出重点,一个 Shell 程序的性能优化(2),省略了文件存在性判断和异常捕获以及帮助提示等程序语句#程序的工作目录
解决方法2:
将内层循环的逐个比较的方法改为二分查找法进行判断,程序代码如下:
#!/bin/bash #Author Xsh date:08-15-2006 #程序中使用了二分查找法进行号码的范围判断 #为突出重点,省略了文件存在性判断和异常捕获以及帮助提示等程序语句 #程序的工作目录为当前目录 echo "Time:$(date)==>Strat to processing........." #显示程序开始运行时间 while read numseg do tmplow="${tmplow} $(expr substr ${numseg} 1 10 & >/dev/null ) " tmptop="${tmptop} $(expr substr ${numseg} 12 10 & >/dev/null ) " done < ./numseg.txt #读取号段文件,下限号段存入变量tmplow,上限号段存入变量tmptop arr_lownug=(${tmplow}) #将下限号段存入数组arr_lownug arr_topnug=(${tmptop}) #将上限号段存入数组arr_topnug #定义函数checknum(),输入参数为需要检查的"计费号码",输出参数为0或者1 #若checknum()输出为0 表示"计费号码" 不在号段文件的所有号段范围内 #若checknum()输出为1 表示"计费号码" 在号段文件的所有号段范围内 # checknum()函数中用二分搜索法进行号码的判断 checknum(){ thisnum=$1 ckresult=0 lowflag=0 topflag=$(expr ${#arr_lownug[*]} - 1 ) #标注1 MaxIndex=$(expr ${#arr_topnug[*]} - 1 ) #标注2 midflag=0 midflag=$(expr ${topflag} / 2 ) #标注3 if [ "${thisnum}" \< "${arr_lownug[0]}" -o "${thisnum}" \> "${arr_topnug[${MaxIndex}]}" ] then return 0 else while [ "$lowflag" != "$midflag" ] do if[ "$thisnum" \> "${arr_lownug[${midflag}]}" -o "$thisnum" == \ "${arr_lownug[${midflag}]}" ] then lowflag=${midflag} midflag=$(expr `expr ${topflag} + ${lowflag}` / 2 ) #标注4 elif["$thisnum"\<"${arr_lownug[${midflag}]}" -o "$thisnum" == \ "${arr_lownug[${midflag}]}" ] then topflag=${midflag} midflag=$(expr `expr ${topflag} + ${lowflag}` / 2 ) #标注5 else echo "Error!" fi done if [ "$thisnum" \< "${arr_topnug[${lowflag}]}" -o "$thisnum" == \ "${arr_topnug[${lowflag}]}" ] then return 1 else return 0 fi fi }#函数定义完毕 while read f do org="$(expr substr ${f} 1 10)" #标注6 checknum ${org} returnval=$? if [ "$returnval" == "1" ] then echo "${f}" >> ./Match_result.cdr #将匹配的记录存入结果文件1 else echo "${f}" >> ./NoMatch_result.cdr #将不匹配的记录存入结果文件2 fi done < ./rttest.txt echo "Time:$(date) ==> Proccess is end! " exit 0; |
更多精彩
赞助商链接