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-बिट लिनक्स पर, देता है:
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
कमांड एक एकल देशी प्रक्रिया है जो /usr/bin/true
कमांड को कई बार जगाती है , इसके बजाय for
और while
लूप जो सभी बैश में व्याख्या की जाती है। बेशक यह केवल एक ही आदेश के लिए काम करता है; यदि आपको प्रत्येक पुनरावृत्ति लूप में कई कमांड करने की आवश्यकता है, तो यह sh -c 'command1; command2; ...'
xargs से गुजरने की तुलना में बस तेज, या शायद तेज़ होगा
-P1
यह भी करने के लिए, कहते हैं बदला जा सकता है, -P8
समानांतर में 8 प्रक्रियाओं अंडे देने के लिए गति में एक और बड़ा बढ़ावा मिलता है।
मुझे नहीं पता कि GNU समानांतर इतना धीमा क्यों है। मैंने सोचा होगा कि यह xargs के बराबर होगा।
let ++n
बजाय उपयोग कर सकते हैंn=$((n+1))
।