xargs
ある速いです:
#!/usr/bin/bash
echo "while loop:"
n=0; time while (( n++ < 10000 )); do /usr/bin/true ; done
echo -e "\nfor loop:"
time for ((n=0;n<10000;n++)); do /usr/bin/true ; done
echo -e "\nseq,xargs:"
time seq 10000 | xargs -I{} -P1 -n1 /usr/bin/true
echo -e "\nyes,xargs:"
time yes x | head -n10000 | xargs -I{} -P1 -n1 /usr/bin/true
echo -e "\nparallel:"
time parallel --will-cite -j1 -N0 /usr/bin/true ::: {1..10000}
最新の64ビットLinuxでは、次のようになります。
while loop:
real 0m2.282s
user 0m0.177s
sys 0m0.413s
for loop:
real 0m2.559s
user 0m0.393s
sys 0m0.500s
seq,xargs:
real 0m1.728s
user 0m0.013s
sys 0m0.217s
yes,xargs:
real 0m1.723s
user 0m0.013s
sys 0m0.223s
parallel:
real 0m26.271s
user 0m4.943s
sys 0m3.533s
xargs
コマンドはすべてBashで解釈されるand ループでは/usr/bin/true
なく、コマンドを複数回生成する単一のネイティブプロセスであるため、これは理にかなっています。もちろん、これは単一のコマンドに対してのみ機能します。ループの各反復で複数のコマンドを実行する必要がある場合は、xargsに渡すよりも速く、またはおそらく速くなります。for
while
sh -c 'command1; command2; ...'
-P1
また、たとえば、に変更することができ-P8
速度のもう一つの大きな後押しを得るために、並列に8つのプロセスを起動します。
なぜGNUパラレルが非常に遅いのかわかりません。私はそれがxargsに匹敵すると思いました。
let ++n
代わりにn=$((n+1))
(3文字少ない)を使用できます。