Shell性能调优

来源:互联网 发布:淘宝香港高登怎么样 编辑:程序博客网 时间:2024/04/29 14:19

一、避免不必要的外部命令避免管道嵌套太深

       写shell角本很爽,其中管道与重定向提供的强大的组合能力功不可没,管道的结构始终闪现在UNIX的设计中,促进了“做单件事比做好”哲学的萌发,因此写shell角本时很容易习惯性地拼接管道,awk、sed、bc等外部命令嵌入太多,管道层次太深,导致性能不佳,awk、sed等外部命令具有强大的文本处理能力,带来的弊端是频繁的进程生成维护的性能开销,针对此可以:

  1. shell本身提供了丰富的字符串处理能力,如果能用原生的命令处理的不要使用awk、sed处理

    (shell字符串操作可以参考此文:http://tldp.org/LDP/abs/html/string-manipulation.html)

  2. 如果文本需要非常复杂的处理,可以考虑用perl、python等来实现,比如perl就是专门为了取代awk而诞生的

二、使用后台执行

     如查任务执行需要比较长的时间,可以考虑把任务分割成多个子任务并放后台处理,在bash里很方便通过在命令后面加符合“&”启动新的后台进程,wait命令可用来等待所有后台进程执行完成(等待某个特定进程用:wait pid),并行处理伪码:

for ARG in  $*;do

    command $ARG &

    NPROC=$(($NPROC+1))

    if [ "$NPROC" -ge 4 ];then

        wait

        NPROC=0

    fi

Done

一次运行4个进程并等待运行完成后再执行4个(尽量保证每个任务的执行时间相差不大,这样才能发挥并行执行的优势)

 

三、延迟输出

      输出到文件需要时间,输出到控制台更需要时间,为了性能考虑可以把输出命令放在后台执行或者把多次输出组织在一起做一次输出,同样的道理对于程序逻辑里的一些耗时的比较、数学计算、eval计算等如果后面还可能用到计算结果的,可以用一个变量保存结果,防止重复计算

 

四、用seb合并多个表达式

    像其它外部命令一样,sed的启动要消耗时间,涉及到子进程的生成fork与exce之类,sed的-e使你能在sed的一个实例里处理多个操作,性能优于每个单独处理,比如:

function1() 

    LOOP=0 

    while [ $LOOP -lt 1000 ] ; do 

        echo "This is a test." | sed 's/a/burnt/g' | sed 's/e/oa/g' > /dev/null 

  

        LOOP=$((LOOP + 1)) 

    done 

}

可以通过下面这样写来优化性能:

echo "This is a test." | sed -e 's/a/burnt/g' -e 's/e/oa/g' > /dev/null 

 

五、用shell的数学计算,其性能优于外部工具

      用shell特定的数学符号$(( $VAR + 1)) ,其性能是expr命令,expr性能优于bc,当shell数学计算不能胜任时优先用epxr,浮点计算用bc(性能比较差)

 

六、pintf性能优于echo

可用printf代替echo做输出

 

七、选择合适的控制结构

       当程序分支较多时,选择合适的控制结构有利于优化性能的提升,性能优化的方向如下:

用eval命令实现多分支------>只用if实现多分支------>用if配合elif实现多分支------>用case实现多分支

 

八.算法为王

请参考<《技巧:一个 Shell 程序的性能优化》一文

http://www.ibm.com/developerworks/cn/linux/l-shprg/index.html?S_TACT=105AGX52&S_CMP=techcsdn

0 0