WEB开发网      婵犵數濮烽弫鍛婄箾閳ь剚绻涙担鍐叉搐绾剧懓鈹戦悩瀹犲闁汇倗鍋撻妵鍕箛閸洘顎嶉梺绋款儑閸犳劙濡甸崟顖氬唨闁靛ě浣插亾閹烘鈷掗柛鏇ㄥ亜椤忣參鏌″畝瀣暠閾伙絽銆掑鐓庣仭缁楁垿姊绘担绛嬪殭婵﹫绠撻、姘愁樄婵犫偓娴g硶鏀介柣妯款嚋瀹搞儱螖閻樺弶鍟炵紒鍌氱Ч瀹曟粏顦寸痪鎯с偢瀵爼宕煎☉妯侯瀳缂備焦顨嗗畝鎼佸蓟閻旈鏆嬮柣妤€鐗嗗▓妤呮⒑鐠団€虫灀闁哄懐濮撮悾鐤亹閹烘繃鏅濋梺闈涚墕濡瑩顢欒箛鏃傜瘈闁汇垽娼ф禒锕傛煕閵娿儳鍩f鐐村姍楠炴﹢顢欓懖鈺嬬幢闂備浇顫夊畷妯肩矓椤旇¥浜归柟鐑樻尭娴滃綊姊虹紒妯虹仸闁挎洍鏅涜灋闁告洦鍨遍埛鎴︽煙閼测晛浠滃┑鈥炽偢閹鈽夐幒鎾寸彇缂備緡鍠栭鍛搭敇閸忕厧绶炴俊顖滅帛濞呭洭姊绘担鐟邦嚋缂佽鍊垮缁樼節閸ャ劍娅囬梺绋挎湰缁嬫捇宕㈤悽鍛婄厽閹兼番鍨婚埊鏇㈡煥濮樿埖鐓熼煫鍥ュ劤缁嬭崵绱掔紒妯肩畺缂佺粯绻堝畷姗€濡歌缁辨繈姊绘担绛嬪殐闁搞劋鍗冲畷顖炲级閹寸姵娈鹃梺缁樻⒒閳峰牓寮崒鐐寸厱闁抽敮鍋撻柡鍛懅濡叉劕螣鐞涒剝鏂€闂佺粯鍔曞Ο濠囧吹閻斿皝鏀芥い鏃囨閸斻倝鎽堕悙鐑樼厱闁哄洢鍔屾晶顖炴煕濞嗗繒绠婚柡灞界Ч瀹曨偊宕熼鈧▍锝囩磽娴f彃浜炬繝銏f硾椤戝洨绮绘ィ鍐╃厵閻庢稒岣跨粻姗€鏌ㄥ☉妯夹fい銊e劦閹瑩顢旈崟顓濈礄闂備浇顕栭崰鏍礊婵犲倻鏆﹂柟顖炲亰濡茶鈹戦埄鍐ㄧ祷妞ゎ厾鍏樺璇测槈閵忕姈鈺呮煏婢跺牆鍔撮柛鏂款槺缁辨挻鎷呯粙搴撳亾閸濄儳鐭撶憸鐗堝笒閺嬩線鏌熼崜褏甯涢柡鍛倐閺屻劑鎮ら崒娑橆伓 ---闂傚倸鍊搁崐鐑芥倿閿旈敮鍋撶粭娑樺幘濞差亜鐓涢柛娑卞幘椤斿棝姊虹捄銊ユ珢闁瑰嚖鎷�
开发学院软件开发Shell 一个 Shell 程序的性能优化 阅读

一个 Shell 程序的性能优化

 2009-06-30 04:50:00 来源:WEB开发网 闂傚倸鍊搁崐椋庢濮橆兗缂氱憸宥堢亱闂佸湱铏庨崰鏍不椤栫偞鐓ラ柣鏇炲€圭€氾拷闂傚倸鍊搁崐椋庣矆娓氣偓楠炲鏁撻悩鎻掔€梺姹囧灩閻忔艾鐣烽弻銉︾厵闁规鍠栭。濂告煕鎼达紕校闁靛洤瀚伴獮鎺楀箣濠靛啫浜鹃柣銏⑶圭壕濠氭煙閻愵剚鐏辨俊鎻掔墛缁绘盯宕卞Δ鍐冣剝绻涘畝濠佺敖缂佽鲸鎹囧畷鎺戭潩閹典焦鐎搁梻浣烘嚀閸ゆ牠骞忛敓锟�婵犵數濮烽弫鍛婃叏椤撱垹绠柛鎰靛枛瀹告繃銇勯幘瀵哥畼闁硅娲熷缁樼瑹閳ь剙岣胯鐓ら柕鍫濇偪濞差亜惟闁宠桨鑳堕崝锕€顪冮妶鍡楃瑐闁煎啿鐖奸崺濠囧即閵忥紕鍘梺鎼炲劗閺呮稒绂掕缁辨帗娼忛埡浣锋闂佽桨鐒﹂幑鍥极閹剧粯鏅搁柨鐕傛嫹闂傚倸鍊搁崐椋庢濮橆兗缂氱憸宥堢亱闂佸湱铏庨崰鏍不椤栫偞鐓ラ柣鏇炲€圭€氾拷  闂傚倸鍊搁崐鐑芥嚄閼哥數浠氱紓鍌欒兌缁垶銆冮崨鏉戠厺鐎广儱顦崡鎶芥煏韫囨洖校闁诲寒鍓熷铏圭磼濡搫顫嶅銈嗗姉閸樠囧煡婢跺á鐔兼煥鐎n兘鍋撴繝姘拺鐟滅増甯掓禍浼存煕閹惧鈽夐柍缁樻煥椤繈鎳滅喊妯诲闂備礁鎲$粙鎴︺偑閺夋垟鏋旈柡鍐e亾缂佺粯绋撴禒锕傚磼濮橆剦鐎抽梻浣哥-缁垶骞戦崶顒傚祦閻庯綆浜栭弨浠嬫煙闁箑澧い鏂垮€规穱濠囨倷椤忓嫧鍋撻弽褜娼栧┑鐘宠壘閸屻劎鎲歌箛娑樼疅闁圭虎鍠楅弲鎼佹煥閻曞倹瀚�
核心提示: 将以上程序投入运行,号段文件有 71行记录,一个 Shell 程序的性能优化(3),需要分拣的通话话单文件17 万条左右通过观察发现此方法的执行效率确实比解决方法1 提高了很多,但是仍需要数小时的时间才能执行完毕,将程序的运行时间大大的缩短,当然此程序还有可以改进的地方,我另外写了一个同样功能的C语言程序,执行同

   将以上程序投入运行,号段文件有 71行记录,需要分拣的通话话单文件17 万条左右通过观察发现此方法的执行效率确实比解决方法1 提高了很多,但是仍需要数小时的时间才能执行完毕。我另外写了一个同样功能的C语言程序,执行同样的测试数据得出结果仅需要10~15秒的时间!shell 程序确实要比同样功能的C程序慢一些,但是目前的情况是用C程序处理只需要几秒钟时间, 而Shell程序确需要数小时!在用此Shell程序处理的时候我用Top命令看了一些系统资源的消耗发现CPU、内存以及IO的占用都极小,说明系统资源很充足,不是系统的问题造成了程序处理速度慢。问题出在哪了呢?

   我用命名ps -ef 观察系统进程的运行情况,发现每过几秒种就会有一个expr进程产生,这个进程运行很短的时间就消失了(不仔细观察可能都看不到有expr这个进程产生)。这时候我觉得我好像发现程序运行慢的原因了:程序的几个循环里面都有用expr进行计算的语句,expr属于Shell外部命令,所以每次运算都要产生一个 expr进程,而程序的运行种最消耗时间的除了IO操作外就数产生新进程操作了,于是我决定把用expr进行计算的地方都尽量修改为用shell的内部命令进行计算。程序变成了下面的样子(标注1~标注6为修改过的地方):

程序代码如下:


―――――――――――――――――――――――――――――――――――――――
#!/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=$((${#arr_lownug[*]} - 1 ))   #标注1
   MaxIndex=$((${#arr_topnug[*]} - 1 ))  #标注2
   midflag=0
   midflag=$((${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=$(( $((${topflag} + ${lowflag})) / 2 )) #标注4
elif["$thisnum"\<"${arr_lownug[${midflag}]}" -o "$thisnum" == \
"${arr_lownug[${midflag}]}"] 
then    
     topflag=${midflag}
     midflag=$(($((${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="${f:0: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;

   将修改过的程序进行运行,很快就得出了结果,总的运行时间没有超过8分钟。此时这个程序的运行效率已经基本可以让人接受了。同样的一个问题由于改进了程序算法和充分利用了LinuxShell的内置运算符,将程序的运行时间大大的缩短。当然此程序还有可以改进的地方,对此文感兴趣的读者可以对此程序做进一步优化。

上一页  1 2 3 

Tags:一个 Shell 程序

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接