Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 消除子外壳以加快处理速度?_Linux_Bash_Shell_Subshell - Fatal编程技术网

Linux 消除子外壳以加快处理速度?

Linux 消除子外壳以加快处理速度?,linux,bash,shell,subshell,Linux,Bash,Shell,Subshell,我已经读到,调用子shell的脚本速度很慢,这可以解释为什么我的脚本速度很慢 例如,在这里,我运行一个循环,从数组中获取一个数字,这个循环是否每次都运行子shell,不使用子shell可以解决这个问题 mmode=1 modes[1,2]="9,12,18,19,20,30,43,44,45,46,47,48,49" until [[ -z $kik ]];do ((++mloop)) kik=$(echo ${modes[$mmode,2]} | cut

我已经读到,调用子shell的脚本速度很慢,这可以解释为什么我的脚本速度很慢

例如,在这里,我运行一个循环,从数组中获取一个数字,这个循环是否每次都运行子shell,不使用子shell可以解决这个问题

mmode=1
modes[1,2]="9,12,18,19,20,30,43,44,45,46,47,48,49"
until [[ -z $kik ]];do
    ((++mloop))
    kik=$(echo  ${modes[$mmode,2]} | cut -d "," -f $mloop)
    
    filename=$(basename "$f")
    # is all these lines
    
    xcolorall=$((xcolorall+$storednr)
    # also triggering
    
    pros2=$(echo "100/$totpix*$xcolorall" | bc -l) 
    IFS='.' read -r pros5 pros6 <<< "$pros2"
    procenthittotal2=$pros5.${pros6:0:2}
            
    #subshells and if,
    # is it possible to circumvent it?  
    #and more of the same code..
done
mmode=1
模式[1,2]=“9,12,18,19,20,30,43,44,45,46,47,48,49”
直至[[-z$kik]];做
(++mloop))
kik=$(echo${modes[$mmode,2]}| cut-d“,”-f$mloop)
文件名=$(基本名称“$f”)
#这些都是线吗
xcolorall=$((xcolorall+$storednr)
#也触发
pros2=$(echo“100/$totpix*$xcolorall”| bc-l)

如果s='.'read-r pros5 pros6可以用bash内置命令替换问题中显示的所有子shell和extern命令

  • kik=$(echo${modes[$mmode,2]}| cut-d“,“-f$mloop)
    可替换为

    mapfile-d,-t-s$((mloop-1))-n1 kik,这取决于您的shell。看起来这是bash,它将派生任何$(…),而ksh93不会。参见示例,基本要点是,最好使用
    bash
    调用具有适当输入的其他工具。如果您更好地描述您的输入,也许有人可以想出一种不需要这种bash循环解决方案的方法。我支持liborm:我认为子shell不是问题,b但是循环是很慢的。bash中的循环很慢,有或没有子shell。通常有一些方法可以在没有循环的情况下处理。注意:
    $(())
    不会生成子shell;它是一个直接在主shell中解析的算术表达式。另一方面,
    var=$(echo something | somecommand)
    创建三个子流程:一个用于管理管道的子shell,另一个用于执行
    echo
    ,另一个用于运行
    somecommand
    var=$(somecommand可能会退后一步,解释您实际要做的事情。您是在计算图像中某一颜色的像素吗?您可能完全使用了错误的工具。我刚刚测试了您的解决方案,第一个解决方案以40xloop的速度将运行时间从8.9秒降低到了3.5秒,我对子shell的速度如此之慢感到惊讶。然而,精确性离子2溶液不起作用…谢谢你让我知道。你能详细说明一下“不起作用”吗使用
    totpix=1200;xcolorall=750
    我得到的
    62.50
    比我从
    bc
    得到的
    62.499999999750
    更精确。是否
    xcolorall
    也是一个浮点数?如果是,那么你也必须在这里应用同样的技巧。当我使用set-e运行时((pros=10**precision*100*xcolorall/totpix))'命令退出时出现错误1,即使我在代码中将pros改为pros2,我也不会从中得到任何结果。xcolorall是像素数,不是浮动的。我用我的完整函数更新了这个问题以计算百分比。感谢您现在让我这么做。我很高兴能提供帮助。