ãã®èšäºã¯ãã·ã§ã«ã¹ã¯ãªãã ãªãã¡ã¯ã¿ãªã³ã° ïœé ãã·ã§ã«ã¹ã¯ãªãããäŸé€ãããŠãã®ã§èçããŠ256åã«é«éåãããŸããïœãã®ç¶ç·šã§ãã該åœã®èšäºã§ã¯ãªãã¡ã¯ã¿ãªã³ã°ãè¡ããšå ±ã«ã·ã§ã«ã¹ã¯ãªããã®é«éåãè¡ããŸãããããã®çµæãšããŠã³ãã³ã眮æãšãã€ããã³ãŒãããæ¶ããŸããããããã¯é ããµãã·ã§ã«ã䜿ã£ãŠãããããã³ãã³ã眮æããã€ããæ¶ããŠããã®ãé«éåããçç±ã®äžã€ã§ãã
å®ã¯ãã€ãã䜿ã£ããããšèšã£ãŠå¿ ãããéããªãããã§ã¯ãªããå Žåã«ãã£ãŠã¯é ããªãããšãããããŸãããã€ãã䜿ããšã·ã§ã«ã¹ã¯ãªããã¯éããªããšåçŽã«æã£ãŠãã人ã«ãšã£ãŠã¯æå€ãªè©±ã§ã¯ãªãã§ããããïŒãšããããšã§ãã®èšäºã§ã¯ãã€ãã©ã€ã³ã«çŠç¹ãåœãŠãŠè§£èª¬ããããšæããŸãã
ãã€ãåŠçã«é¢ããé¢é£èšäºïŒ2021-12-06 远èšïŒ
ãã®èšäºãæžããæç¹ããæŽã«è©³ãã調æ»ãããã®çµæã以äžã®é¢é£èšäºãŸãšããŠããŸããçŸæç¹ã§ã®çµè«ãäžèšã§èšããªãã°**ãã³ãã³ãããã€ãã§ã€ãªãã°äžŠååŠçãè¡ãããããæ£ãããããªããã°ããã©ãŒãã³ã¹ã¯äœäžããã**ã§ããæ£ããç¥èãæã£ãŠèšæž¬ã«åºã¥ããŠãã€ãã§ã€ãªããªããã°ããã©ãŒãã³ã¹ãäžããã©ãããéã«äžããŠããŸãããšããããŸãããã€ãã©ã€ã³äžŠååã䜿ã£ãŠããã©ãŒãã³ã¹ãäžããã®ã¯é£ãããã³ãã³ããæ®éã«ãã€ãã§ã€ãªãã ã ãã§ã¯å¹ççãªäžŠååŠçã¯è¡ãããŸããã
â
ã·ã§ã«ã¹ã¯ãªãããã·ã§ã«èžããã®è±åºã ã ã³ãã³ãããã€ãã§é·ãã€ãªããããããã€ãå°çãã®ãªãã¡ã¯ã¿ãªã³ã°æ¹æ³
â
ã·ã§ã«ã¹ã¯ãªããã§ããã€ãã©ã€ã³äžŠååããã¬ãã§ãã£ãŠã¿ã ã ãã€ãïŒäžŠååŠçã§CPUã®æå€§å¹çãåŒãåºãç¥è
ã»ã·ã§ã«ã¹ã¯ãªããã®ãã€ãã䜿ãããªãéµã¯ããã€ãã§ã€ãªãã³ãã³ãæ°ã5ã€ããããŸã§ã«æããããšïŒ
ã»[ã·ã§ã«ã¹ã¯ãªããã®ããŒã¿åºåã¿ã€ãã³ã°ãé
ãïŒ ããã¯ãã€ãéä¿¡ã«èµ·å ãããããã¡ãªã³ã°ãåå ãããšãã話] (https://qiita.com/ko1nksm/items/62936bca90e2c11530d2)
ã»ãã€ãã䜿ã£ãŠé«éåããã·ã§ã«ã¹ã¯ãªããã䞊åå®è¡ãããšéã«é
ããªãè¬çŸè±¡ã«ã€ããŠ
â ã¯ãªã¹ã¹ã¡
ãã€ãã䜿ããšéããªããšããäž»åŒµã®æ ¹æ
ãã€ãã䜿ããšéããªããšããäž»åŒµã®æ ¹æ ã¯å€§ããïŒã€ãããŸãã
- ãã€ãã§éãå€éšã³ãã³ãã«ããŒã¿ãæž¡ããŠåŠçããããã
ïŒäžè¬çã«ã·ã§ã«ã¹ã¯ãªããããå€éšã³ãã³ãã®æ¹ãéãïŒ - ãã€ãã®ååŸãããããã®ããã»ã¹ã§åå¥ã«åäœããã®ã§æå³ããªããŠã䞊ååŠçãè¡ããããã
ãã® 2 ã€ã®æ ¹æ ã¯ééã£ãŠã¯ããŸããããããé ããããã«ããã¯ãååšããŠããããã®ããšãæèããã«ãã€ãã䜿ããšéããªããªãã©ãããéã«é ããªããŸãã
ãã€ãã䜿ããšé ããªãïŒ
ãã€ãã䜿ã£ãã»ããéããšããããšã瀺ããã³ãããŒã¯ã¯ããã€ããããŸããïŒäŸ 1, 2ïŒ
ãããªã®ã«ãã€ãã䜿ããšé
ããªããšã¯ã©ãããããšã§ããããïŒãã®è¬ãè§£ãéµã¯ãã³ãããŒã¯ã§äœ¿ã£ãŠãããŒã¿ã®éã§ãã
äžè¬çã«ãã³ãããŒã¯ãšããã®ã¯èšæž¬ã®èª€å·®ãå°ãªãããããã£ãæéã®å·®ãæç¢ºã«ããããã«å€ãã®ããŒã¿ãçšããŠèšæž¬ããŸããäŸãã°äœäžè¡ãã®ãã¡ã€ã«ãçšæããŠãã㊠cut -d, -f2 | tr -dc 'aeiou' | wc -c ã®ããã«å®è¡ãããšãã§ããããããã®ãããªèšæž¬æ¹æ³ã§ã¯ãµãã·ã§ã«ãŸãã¯æŽã«é
ãé
ãå€éšã³ãã³ãã®å®è¡ã¯æ°åããè¡ãããªããããäœäžè¡ãã®ããŒã¿åŠçã«ãããæéã§èŠããªããªã£ãŠããŸããŸãã
éã«èšãã°ããŒã¿ã®è¡æ°ãå°ãªãå Žåã¯ãµãã·ã§ã«ïŒãŸãã¯å€éšã³ãã³ãå®è¡ïŒã®åœ±é¿ãçžå¯Ÿçã«å€§ãããªããšããããšã§ããã«ãŒãã®äžã§å€éšã³ãã³ããåŒã³åºããšæ¥µç«¯ã«é
ããªãã®ãäžåã®ã«ãŒãã§æ±ãããŒã¿ãå°ãªãããã§ããäœäžè¡ãã®ããã¹ããã¡ã€ã«ã®çœ®æãè¡ãã®ã§ããã° sed ã awk ã䜿ã£ãã»ããéããªããŸãããã»ãã®æ°åå¿
èŠãªã ããšããå Žåã¯é
ãå€éšã³ãã³ãã䜿ããã«ã·ã§ã«ã¹ã¯ãªããã§å®è£
ããã»ããéããªããŸãã
ãã ãã·ã§ã«ã¹ã¯ãªããã®éçã¯ããã«æ¥ãŸããããããæ°çŸè¡ïŒæ°ãããã€ãïŒçšåºŠãè¶ ããã°å€éšã³ãã³ãã®ã»ããéãã§ããããããããªãããããªè¡æ°ãåŠçããªããšããå Žåãçµæ§ããã¯ãã§ããå€éšã³ãã³ãã§å®è£ ãããã·ã§ã«ã¹ã¯ãªããã§å®è£ ãããã¯å®éã®ãŠãŒã¹ã±ãŒã¹ã§æ±ºããªããã°ãªããŸãããããã³ãããŒã¯ãå®éã®ãŠãŒã¹ã±ãŒã¹ã«è¿ãç¶æ³ã§èšæž¬ããªããã°æå³ããããŸããã
泚æ ãã€ãéä¿¡ãå€éšã³ãã³ããã®ãã®ãé ãããã§ã¯ãããŸããããã€ãã䜿ãããšã§ãµãã·ã§ã«ãçæããã®ã§é ããªããšããããšã§ããïŒãµãã·ã§ã«ã®çæã ãã§ãªãå éšã§äœ¿çšãããã€ããã¡ã€ã«ã®çæãšåé€ã§ãæéãããã£ãŠãå¯èœæ§ããããŸããåŸæ¥è©³çŽ°ãæ€èšŒããŠèšäºãæŽæ°ãããããããŸãããïŒ
ãµãã·ã§ã«ãé ãçç±
倧éæã«èšãã°åããã»ã¹ãçæãããŠããããã§ããäŸãã°ä»¥äžã®ãããªãã€ãã䜿ãã³ãŒãã§æ°ãã«ãŠã³ãããŠãããã®åŸã®è¡ã§æ°ãã«ãŠã³ããããŠãªããšããç¶æ³ã«ãªã£ãããšã¯ãªãã§ããããïŒ
cnt=0
seq 10 | while read -r line; do cnt=$((cnt+1)); done
echo "$cnt" # => 0 â» ã·ã§ã«ãèšå®ã«ãã£ãŠã¯ 10 ã®å ŽåããããŸã
# åè 以äžã®ããã«ããã®ãæ£ãã
seq 10 | {
cnt=0
while read -r line; do cnt=$((cnt+1)); done
echo "$cnt" # => 10
}
ããã¯ãã€ãã®å·Šå³ããããããµãã·ã§ã«ïŒâåããã»ã¹ïŒã§å®è¡ãããŠããåããã»ã¹ã§ã«ãŠã³ãããŠã芪ããã»ã¹ã«ã¯åæ ãããªãããã§ããããã»ã¹ã®çæã¯ãšãŠãéãåŠçã§ãããããããè¡ããµãã·ã§ã«ã¯å€éšã³ãã³ãå®è¡ã»ã©ã§ã¯ãªãã«ããé ããªããŸãããã®ããäžéšã®ã·ã§ã«ïŒkshïŒã§ã¯ç¹å®ã®æ¡ä»¶ãæºããããæã«ãµãã·ã§ã«ã§åããã»ã¹ãäœããªãæé©åãè¡ã£ãŠããã»ã©ã§ãã
远èš
ã³ã¡ã³ãã§ read ã³ãã³ãã seq ã³ãã³ãã®åºåã 1 ãã€ããã€èªãã§ããã®ã§ããã®ããã§é
ãã®ã§ã¯ïŒãšããææããã£ãã®ã§è¿œèšã§ãã以äžã®ã³ãŒãã«ã¯ read ã³ãã³ãã¯å«ãŸããŠããŸããã
$ time for i in $(seq 10000); do true; true; done
real 0m0.028s
user 0m0.028s
sys 0m0.000s
$ time for i in $(seq 10000); do true | true; done
real 0m5.791s
user 0m7.009s
sys 0m2.918s
ãã® 2 ã€ã®ã³ãŒãã¯ãã€ãã®æç¡ãé€ããŠåãã³ãã³ããåãæ°ã ãå®è¡ããŠããŸããéãã¯åŸè ã¯ãã€ãã䜿ããããµãã·ã§ã«ãçæããããšããç¹ã§ããçµæãããæãããªããã«ãã€ãã䜿ãïŒ= ãµãã·ã§ã«ãçæãããïŒã ãã§ããã©ãŒãã³ã¹ã¯å€§ããäœäžããŸãã
ããäžã€æç¢ºã«ããµãã·ã§ã«ã䜿ã£ããã³ãŒãã§ã®äŸã§ãã
$ time for i in $(seq 10000); do true; done
real 0m0.021s
user 0m0.022s
sys 0m0.000s
$ time for i in $(seq 10000); do (true); done
real 0m5.224s
user 0m4.245s
sys 0m1.889s
() ã¯ãµãã·ã§ã«ãçæããŸããããããããµãã·ã§ã«ã倧ããªããã©ãŒãã³ã¹äœäžãåŒãèµ·ããããšãã¯ã£ããããããŸãã
ãã€ãã䜿ã£ãŠåŠçãæ©ãå®äºããŠãéãã¯ãªã£ãŠã¯ããªã
ãã€ãã䜿ããšå€ãã®å ŽåãåŠçãæ©ãïŒå®è¡æéïŒçµãããŸãããããããã¯éãïŒå®è¡é床ïŒãªã£ãããã§ã¯ãããŸãããåŠçãæ©ãçµãçç±ã¯ãã€ãã§ã€ãªãã ã³ãã³ãã®ããããã䞊åã§åäœããããã§ãããã«ãã³ã¢ãäžè¬çã«ãªã£ãä»ã§ã¯ç¹ã« CPU ããªã«ãããäŒãã§ããå Žåãå€ãã®ã§ãã€ãã䜿ã£ãŠäžŠååãå¹ççã« CPU ã䜿çšããããšã§æ©ãåŠçãçµãããŸãããããããã§ãå®è¡é床ãäžãã£ãããã§ã¯ãããŸãããïŒè² è·ãããããš Turbo Boost æè¡ãªã©ã§ CPU ã®åšæ³¢æ°ãäžãã£ããããã®ã§ç¶æ³æ¬¡ç¬¬ã§ã¯éããªã£ããã®ãããªçµæãã§ãããšããããŸãã®ã§æ€èšŒã¯æ éã«è¡ãå¿ èŠããããŸããïŒ
åŠçã®äžŠååã¯ãã€ãã䜿ã以å€ã«ãããã¯ã°ã©ãŠã³ãããã»ã¹ã§å®è¡ããããšã§è¡ãããšãã§ããŸããäŸãã° CPU ã³ã¢ã 8 åãã£ããšããŠããã¯ã°ã©ãŠã³ãããã»ã¹ã 8 åå®è¡ããã° CPU ã³ã¢ã䜿ãåã£ãŠåŠçãè¡ãããšãã§ããŸãããã®å Žåã«ããããã®ããã»ã¹ã®äžã§ãã€ãã䜿ã£ããšããŠãããã§ã« CPU ã³ã¢ã¯äœ¿ãåã£ãŠãããã§åŠçãæ©ãçµããããšã¯ãããŸãããïŒå®éã«ã¯ I/O åŸ ã¡ãªã©ã®ç©ºãæéãæŽ»çšã§ããå¯èœæ§ãããã®ã§å€å°ã¯æ©ããªããšæããŸããïŒ
éããªã£ãããã§ã¯ãªããšã¯èšã䞊ååã«ãã£ãŠæ©ãçµããã®ã§ãã€ãã䜿ãããšã«åé¡ã¯ãªããšæããããããŸãããããã€ãã¯é ããµãã·ã§ã«ã䜿ããšããããšãå¿ããŠã¯ãããŸããã䞊ååã®æ©æµãåŸãããªãç¶æ³ã§ã¯ãã€ãã䜿ããšéã«ããã©ãŒãã³ã¹ãäœäžããŸãã
ãã€ãã䜿ã£ãŠå¹ççã«äžŠååããã®ã¯æ¡å€é£ãã
ãã€ãã䜿ã£ãŠ CPU ã䜿ãåãã®ã¯æ¡å€é£ããã§ããäŸãã° CPU ã³ã¢ã 8 åãã£ããšã㊠CPU ã䜿ãåãã«ã¯ã³ãã³ãã 8 åããã€ãã§ç¹ããªããã°ãããŸããããšãããããã€ãã§ç¹ãã§ããã°ã ããã䞊ååã§ãšã·ïŒãšããæ¹éãªãããã§ããããã§ããããã€ãã§ã€ãªããã³ãã³ãã®æ°ã¯ããžãã¯ã«ãã£ãŠæ±ºãŸãã®ã§ç°¡åã«å¢ããããã®ã§ããããŸããããå®è¡ãããã·ã³ã® CPU æ°ã«å¿ããŠäžŠåæ°ã倿Žããã®ãé£ããã®ã¯èšããŸã§ããããŸããã
ãŸããã€ãã§ç¹ãã ãšããŠäŒãŸãã«åŠçããã«ã¯ããããã®ã³ãã³ããåãé床ã§åŠçããå¿
èŠããããŸããäŸãã° cmd1 | cmd2 | cmd3 ã®å Žå cmd1 ãš cmd2 ãš cmd3 ã¯åçã®é床ã§ããŒã¿ãåŠçããªããã°ãããŸãããããã©ããäžã€ãé
ããã°ä»ã®ã³ãã³ããããã«åŒã£åŒµãããŠåŠçã忢ã CPU ã¯åŸ
ã¡æéãçºçããŠããŸãããšã«ãªããŸããcmd1 ã®åŠçãé
ããã° cmd2 ãš cmd3 ã¯ããŒã¿ãæ¥ããŸã§åŸ
ããªããã°ãããªããšããã®ã¯ããã«åãããšæããŸãããéã« cmd3 ãé
ããŠã cmd1 ãš cmd2 ã¯ããã«åŒãã¥ãããŠé
ããªããŸãããªããªãæšæºåºåãžã®åºåããããã¯ãããããã§ãã
ããã¯æ¬¡ã®ãããªã·ã§ã«ã¹ã¯ãªãããå®è¡ããŠã¿ããšããããŸãããããã 68 è¡ãŸã§ã¯ 0.01 ç§æ¯ã«ãã°ãåºåãããŸããããã以é㯠1ç§æ¯ã«ããåºåãããªãã¯ãã§ãã
# 0.01 ç§ããšã« 1 è¡ïŒ1024 æåïŒåºåãã
output() {
for i in $(seq 1000); do
echo "log $i" >&2
printf "%1023s\n"
sleep 0.01
done
}
# 1 ç§ããšã« 1 è¡åŠçãã
input() {
while read line; do
sleep 1
done
}
output | input
ããšã å ¥ååŽïŒãã€ãã®åŸïŒã¯ CPU ãã¶ãåããŠããŒã¿ãåŠçããŠãããšããŠãåŠçé床ãé ããšãã€ãã®ãããã¡ïŒLinux ã®å Žå 64 KBïŒã«åºåãæºãŸã£ãŠãããŸãããããŠãããã¡ãåãŸã£ãŠããŸããšåºååŽïŒãã€ãã®åïŒã®åºåã¯ãããã¯ãããŠãããã¡ã空ããŸã§åŠçã忢ããã®ã§ CPU ã䜿ãåããŸãããåã³ãã³ãã䞊åã§åããŠãããšããã®ã¯äºå®ã ãšããŠãå Žåã«ãã£ãŠã¯äžŠååŠçãè¡ã£ãŠãããšã¯èšãé£ãç¶æ³ã«ãªã£ãŠããŸããŸãã
è©³çŽ°ãªæ€èšŒ
2021-05-23 è¿œèš å°ãããŒã¿ã«ä¹ããã£ãã®ã§å ·äœçãªäŸã远å ããŸãã
ããå°ãå ·äœçã« CPU 䜿çšçãã©ããªãããå®éã®ããŒã¿ã䜿ã£ãŠèª¬æããŸããæ¬¡ã®ã³ãã³ããå®è¡ããæã®åããã»ã¹ã® CPU 䜿çšçã¯æãããŠã©ããªãã§ããããïŒ
seq 100000000 | sed "s/1/2/g" | tr -d '0'
ãããå®è¡ããåã«ãŸãèŠããŠãããŠã»ããã®ã¯ seq 100000000 åäœã§ã¯äžç¬ïŒ1 ç§æªæºïŒã§çµãããšããããšã§ãã
$ time seq 100000000 > /dev/null
real 0m0.754s
user 0m0.704s
sys 0m0.051s
ã§ã¯ãã³ãããŒã¯ã§ãã
$ time seq 100000000 | sed "s/1/2/g" | tr -d '0' > /dev/null
real 0m35.122s
user 0m34.867s
sys 0m14.630s
äžèšã®ã³ãã³ããå®è¡äžã«ä»ã®ç«¯æ«ãã htop ã³ãã³ããå®è¡ã㊠CPU 䜿çšççã衚瀺ãããšãã®åºåã§ããäžéšã«è¡šç€ºãããŠãã®ã¯å CPU ã³ã¢ã® CPU 䜿çšçã§ããïŒè¡šç€ºãããããããã« 8 ã³ã¢ã® CPU ã䜿çšããŠããŸããïŒ
1 [|| 3.2%] 5 [ 0.0%]
2 [| 0.7%] 6 [|||||||||||||||||||||||||||||||||||||||||||||||||||100.0%]
3 [ 0.0%] 7 [ 0.0%]
4 [||| 2.8%] 8 [|||||| 7.9%]
Mem[||| 95.7M/24.2G] Tasks: 14, 1 thr; 2 running
Swp[ 0K/7.00G] Load average: 0.60 0.36 0.26
Uptime: 7 days, 00:29:58
PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ STIME+ UTIME+ Command
11945 koichi 20 0 7592 784 664 R 99.8 0.0 0:20.30 0:04.33 0:15.97 sed s/1/2/g
11946 koichi 20 0 6532 520 456 S 20.6 0.0 0:04.10 0:01.59 0:02.51 tr -d 0
11944 koichi 20 0 6524 588 524 S 19.3 0.0 0:03.87 0:01.70 0:02.17 seq 100000000
11938 koichi 20 0 9112 4028 3248 R 0.0 0.0 0:00.29 0:00.16 0:00.13 htop
seq ãš sed ãš tr ã®äžã§æéããããã®ã¯ sed ã§ããããšäºæž¬ãããšæããŸãã htop ã®åºåãããåããéã sed ã 100% (æ£ç¢ºã«ã¯ 99.8%) ã§ã³ã¢ã®èœåã䜿ãåã£ãŠããŸãããããŠä»ã®ã³ãã³ãã¯è¶³ãåŒã£åŒµãã㊠CPU 䜿çšç㯠20% ã¡ãã£ãšãã䜿çšã§ããŠããªãããšãããããŸãããŸãåœç¶ã§ãããã€ãã§ç¹ãã ã³ãã³ãïŒã€ãŸã 3 åïŒããå€ã㯠CPU ã³ã¢ã䜿çšããŸããã
sed ãé
ãã®ã§ãã®åŸã«ãã tr ã³ãã³ããé
ããªãã®ã¯åœç¶ã§ãããåã«ãã seq ã³ãã³ããé
ããªã£ãŠããŸããæ¬æ¥ã¯ 1 ç§æªæºã§çµããåŠçãªã®ã«ããã以äžã®æéãããã£ãŠããŸããæçµçã« seq ã® TIME+ (user and system time) 㯠6.75 ç§ãããã«ãªããŸããããã㯠sed ã®åŠçãé
ããã€ãã®ãããã¡ãããµã seq ããããã¯ãããŠããããã§ãã
ãããã®ããŒã¿ããããã€ãã䜿ã£ãŠå¹ççã«äžŠåããã®ã¯é£ãããšããããšãããããŸãã
ãŸã seq ã® UTIME+ (user mode) ã 1ç§ã倧ããè¶
ããŠããããšãæ°ã«ãªããŸãããªãããšèšããšä»¥äžã®ããã«åã«ãã€ãã§ä»ã®ã³ãã³ãïŒè² è·ãå°ãããšæããã tailïŒ ã«å®è¡ãããš 1 ç§ã§çšåºŠã§çµããããã§ããé
ã sed ã«ãã€ãã§æž¡ããšãã€ãã«æž¡ããªãããã seq ã®è² è·ãå¢ããŠããããã«ã¿ããŸãããã®çç±ã¯è©³ãã調ã¹ãŠãªãã®ã§ãã ãã€ãã䜿ãããšã§äœèšãª CPU ã䜿çšããŠãã ãšããçµè«ã«ãªãã®ã§ã¯ãªãããšæšæž¬ããŠããŸãã
$ time seq 100000000 | tail > /dev/null
real 0m1.056s
user 0m1.382s
sys 0m0.674s
ããäžã€é¢çœãäŸãäžã€ããã€ããæµããããŒã¿ã®é²æç¶æ³ãç¥ãããã® pv (pipe viewer) ãšããã³ãã³ãããããŸãããã®ã³ãã³ãã®æ©èœã®äžã€ãšããŠããã€ããæµããããŒã¿ã®è»¢éé床ãå¶éããæ©èœããããŸããã§ã¯ããã§ seq ã³ãã³ããåºåããããŒã¿ãç§é 1 æå ã«å¶éãããã©ããªãã§ããããïŒ
seq 100000000 | pv -q -L 1 | sed "s/1/2/g" | tr -d '0'
1 [ 0.0%] 5 [ 0.0%]
2 [ 0.0%] 6 [ 0.0%]
3 [ 0.0%] 7 [| 0.7%]
4 [ 0.0%] 8 [ 0.0%]
Mem[||| 95.7M/24.2G] Tasks: 15, 1 thr; 1 running
Swp[ 0K/7.00G] Load average: 0.00 0.01 0.07
Uptime: 7 days, 00:52:28
PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ STIME+ UTIME+ Command
12140 koichi 20 0 9112 4008 3232 R 0.0 0.0 0:00.31 0:00.19 0:00.12 htop
12146 koichi 20 0 6672 824 756 S 0.0 0.0 0:00.04 0:00.03 0:00.01 pv -q -L 1
12147 koichi 20 0 7592 772 656 S 0.0 0.0 0:00.00 0:00.00 0:00.00 sed s/1/2/g
12148 koichi 20 0 6532 524 456 S 0.0 0.0 0:00.00 0:00.00 0:00.00 tr -d 0
çµæã¯ç°¡åã«äºæ³ã§ãããšæããŸãã CPU ã¯å šã䜿çšããŸããã1 æåãã€ããŒã¿ã転éãããã®ãåŸ ã£ãŠããããã§ãããåœç¶ã§ããã1 ç§éã« 1æåã§ã¯ããŸãæå³ããããŸããããäŸãã°ç§é 1 MBãšãã«ããã°ããã€ãã䜿ã£ãåŠçã®ïŒäŸãã°å§çž®ãªã©ïŒã®è² è·ãé©åºŠã«èª¿æŽã§ããã®ã§äŸ¿å©ãããããŸããããã®èšäºãæžããŠãéäžã«é¢çœãã³ãã³ããèŠã€ããã®ã§ç޹ä»ã§ããDebian çã§ãããã±ãŒãžãæäŸãããŠããã®ã§ç°¡åã«äœ¿ããŸãããšã¯èšãç§ã¯ã¡ãããšäœ¿ã£ãŠãªãã®ã§ä»ã®èšäºã«ãªã³ã¯ããŸããïŒãã·ã§ã«ã®ãã€ãã®é床(鲿ããŒ) 㯠pv ã§ ããLinuxã®ãã€ãã®æµãã®é²æãèŠå®ãã«ã¯ãïŒ
è£è¶³ ããã¯ã°ã©ã³ãããã»ã¹ã䜿ã£ã䞊ååŠçã®ä»£æ¿æ¹æ³ã«ã€ããŠ
äœè«ã§ãã ShellSpec ã§ã¯äžŠååŠçã«ïŒãã€ãã䜿ããŸããïŒããã¯ã°ã©ãŠã³ãããã»ã¹ã䜿ã£ããã¯ããã¯ã䜿çšããŸãããã㯠POSIX æºæ ã®ã·ã§ã«ã¹ã¯ãªããã®æ©èœã ãã䜿ã£ãŠå®è£ ãããŠããŸããã·ã§ã«ã¹ã¯ãªããã ãã§ CPU ã³ã¢ãã»ãŒå®å šã«äœ¿ãåã£ãŠããã®ãèŠããã®ã¯å§å·»ã§ãã
1 [||||||||||||||||||||||||||||||||||||||||||||||||||||91.6%] 5 [||||||||||||||||||||||||||||||||||||||||||||||||||||90.4%]
2 [||||||||||||||||||||||||||||||||||||||||||||||||||||92.9%] 6 [||||||||||||||||||||||||||||||||||||||||||||||||||||90.5%]
3 [||||||||||||||||||||||||||||||||||||||||||||||||||| 88.3%] 7 [||||||||||||||||||||||||||||||||||||||||||||||||||||89.5%]
4 [||||||||||||||||||||||||||||||||||||||||||||||||||||90.0%] 8 [||||||||||||||||||||||||||||||||||||||||||||||||||||90.9%]
Mem[||| 136M/24.2G] Tasks: 69, 1 thr; 5 running
Swp[ 0K/7.00G] Load average: 2.66 1.37 0.55
Uptime: 7 days, 01:08:36
èšäºã§ãæžããŠããããã«åã«ãã€ãã䜿ã£ãã ãã®äžŠååŠçã§ã¯ïŒéœåã®ããæ¡ä»¶ã«ãªã£ãå Žåãé€ããŠïŒCPU ã䜿ããããŸãããã䜿çšããã³ã¢æ°ãåçã«å€æŽããããšãã§ããŸãããã·ã§ã«ã¹ã¯ãªããã§ãŸãšããªäžŠååŠçãè¡ãããå Žåã¯ããã¯ã°ã©ãŠã³ãããã»ã¹ã䜿ã£ãŠå®è£
ããããšããå§ãããŸãããã¡ãã xargs -P ã GNU parallels ã䜿ãã®ãæã£åãæ©ãã§ãããã·ã§ã«ã¹ã¯ãªããã ãäœããšç§»æ€æ§ãäžãããŸããç°¡åãšãŸã§ã¯èšããŸãããçµæ§æ®éã«äœãããšãåºæ¥ãŸãããïŒé¢é£èšäº POSIXæºæ ã·ã§ã«ã¹ã¯ãªããã§ãã«ãã³ã¢ã®èœåãæŽ»çšãã䞊ååŠçã®å®è£
ïŒæå€§äžŠåæ°ãããGNU Parallel, xargsãªãïŒïŒ
xargsã§éããªãã®ã¯ãã€ãã䜿ã£ãŠããããã§ã¯ãªã
ãã€ãã«ãã䞊ååŠçã®å¹æããŸã£ãããªãããã§ã¯ãããŸããã xargs ã䜿ã£ãŠé床ã倧ããåäžããã®ã¯äžŠååŠçãè¡ã£ãŠããããã§ã¯ãªããé
ãå€éšã³ãã³ãåŒã³åºãã®æ°ã倧å¹
ã«æžãã®ãçç±ã§ããããœãããŠã§ã¢ã®é«ãäºææ§ãšé·ãæç¶æ§ãç®æãPOSIXäžå¿äž»çŸ©ããã°ã©ãã³ã°ãã®ã³ãŒããäŸã«ããŸãã
â æç¶ãåã³ãŒãã£ã³ã°ïŒã¹ãããæ°ãå€ãåŠçå¹çãäœãïŒ
i=3
while [ $i -le 10000 ]; do
file="file${i}.txt"
rm -f $file
i=$((i+3))
done
â ã¹ããªãŒãã³ã°åã³ãŒãã£ã³ã°
awk 'BEGIN{for(i=3;i<=10000;i+=3){print i;}}' |
sed 'sed/.*/file&.txt' |
xargs rm -f
ãã®äž¡è ã®ã·ã§ã«ã¹ã¯ãªãããUNIXæ©ïŒ»CentOS 7.2ïŒIntel Xeon W5580ïŒ4ã³ã¢3.2GHzïŒïŒã¡ã€ã³ã¡ã¢ãª48GBïŒHDD 1.6TBã§å®è¡ãããšããïŒåè ã®æèŠæéã¯2.67ç§ã ã£ãäžæ¹ïŒåŸè ã¯0.05ç§ã§ãã£ãïŒäž¡è ãšã5åå¹³åå€ïŒïŒ
4.1.2é ã§è¿°ã¹ãããã«ïŒããŒã¿åŠçã«ãããŠãåæ§ã«ããŠåå²ãã«ãŒãã¯æå°éã«æãïŒPOSIXã³ãã³ãããã€ãã§ç¹ããªããç©æ¥µçã«ããŒã¿åŠçãä»»ããæ¹éããšããšïŒãã¯ãåŠçéåºŠãæ¹åããïŒ
ãã®èšäºã§ã¯çµè«ãšããŠäžèšã®ããã«æžããŠããŸããåŠçéåºŠãæ¹åããã®ã¯ïŒãã®èšäºã§èšãïŒã¹ããªãŒãã³ã°åã³ãŒãã£ã³ã°ãããããã§ããã€ãã§ç¹ãã ããã§ããªã xargs ã«ãã£ãŠ rm ã³ãã³ãã®åŒã³åºãåæ°ãæžã£ãããã§ãã
æç¶ãåã³ãŒãã£ã³ã°ã§ãã€ãã䜿ãã rm ã®åŒã³åºãåæ°ã ããæžããã以äžã®ã³ãŒããšæ¯ã¹ãŠã¿ãŸãããã
# ãã¡ã€ã«çæ
# touch file{1..10000}.txt
â æç¶ãåã³ãŒãã£ã³ã°ïŒã·ã§ã«ã¹ã¯ãªããçïŒ
list() {
i=3
while [ $i -le 10000 ]; do
echo "file${i}.txt"
i=$((i+3))
done
}
rm -f $(list)
â æç¶ãåã³ãŒãã£ã³ã°ïŒseq çïŒ â»seq 㯠POSIX ã³ãã³ãã§ã¯ãããŸãã
rm -f $(seq --format 'file%.0f.txt' 3 3 10000)
â æç¶ãåã³ãŒãã£ã³ã°ïŒawk çïŒ â»POSIX ã³ãã³ãã®äŸãšããŠ
rm -f $(awk 'BEGIN{for(i=3;i<=10000;i+=3){print "file" i ".txt";}}')
ç§ã®ç°å¢ã§ã¯ä»¥äžã®çµæãšãªããŸããã
- æç¶ãåã³ãŒãã£ã³ã° ã»ã»ã» 2.241 ç§
- ã¹ããªãŒãã³ã°åã³ãŒãã£ã³ã° ã»ã»ã» 0.048 ç§
- æç¶ãåã³ãŒãã£ã³ã°ïŒã·ã§ã«ã¹ã¯ãªããçïŒ ã»ã»ã» 0.093 ç§
- æç¶ãåã³ãŒãã£ã³ã°ïŒseq çïŒ ã»ã»ã» 0.048 ç§
- æç¶ãåã³ãŒãã£ã³ã°ïŒawk çïŒ ã»ã»ã» 0.049 ç§
ãã®ããã«åå²ããã«ãŒãããã®POSIXïŒå€éšïŒã³ãã³ãããã€ãã§ç¹ããªããæç¶ãåã³ãŒãã£ã³ã°ïŒã·ã§ã«ã¹ã¯ãªããçïŒãã§ãã£ãŠãå€éšã³ãã³ãã®åŒã³åºããæžãããšå®è¡é床ã¯å€§ããæ¹åããŸããã·ã§ã«ã¹ã¯ãªããçã seq çãããé ãã®ã¯ããã¡ã€ã«äžèЧã 3333 è¡ãããã®ã§ãããã«å€éšã³ãã³ãã®ã»ããéãçæã§ããããã§ãããã¡ã€ã«æ°ãå°ãªããã°é転ããŸãã
xargs ã¯ã·ã¹ãã ã蚱容ããæå€§ã®åŒæ°ã®åæ°ããŸãšããŠã³ãã³ããåŒã³åºããŠããããšããã¡ãªãããããçŽ æŽãããã³ãã³ãã§ãããè€æ°ã®åŒæ°ããŸãšããŠåŒã³åºããšããããšã¯ãåŒæ°ãããçšåºŠããŸããŸã§ xargs ã¯ã³ãã³ããåŒã³åºããªããšããããšã§ããã€ãŸã xargs ã¯äžŠååŠçãã»ãšãã©è¡ã£ãŠããªããšããããšã«ãªããŸããïŒäžŠååŠçãè¡ãããã® xargs -P ã¯å¥ã®è©±ã§ããïŒxargs ã§å€§å¹
ã«éããªãã®ã¯é
ãå€éšã³ãã³ãã®åŒã³åºãåæ°ãæžãããã§ãã£ãŠãã€ãã䜿ãããšã¯çŽæ¥ã®çç±ã«ã¯ãªã£ãŠããŸããããªã³ã¯å
ã®è«æã瀺ããŠããã®ã¯å€éšã³ãã³ãã®åŒã³åºãããšãŠãé
ããšããäºå®ã§ãã
ãã€ãã䜿ã£ãŠreadãããããforã®æ¹ãéãïŒ
ããã³ãã³ãã®çµæããã€ãã§åãåã£ãŠã·ã§ã«ã¹ã¯ãªããã§åŠçãããšããããšã¯ãå¿
ç¶çã« while + read ã䜿ããšããããšãæå³ããŸãããããŠä»¥äžã® 3 ã€ã®åŠçãæ¯èŒããå Žåãã€ãïŒwhile + readïŒã䜿ã£ãã»ããé
ããªããŸãã
# pipe.sh
seq 100000 | while IFS= read -r line; do
echo "$line"
done
# for.sh
var=$(seq 100000)
for line in $var; do
echo "$line"
done
# loop.sh
i=0
while [ "$i" -lt 100000 ] && i=$((i+1)); do
echo "$i"
done
| pipe.sh | for.sh | loop.sh | |
|---|---|---|---|
| dash | 443ms | 105 ms | 265 ms |
| bash | 1074 ms | 360 ms | 936 ms |
| ksh | 1228 ms | 152 ms | 382 ms |
| mksh | 695 ms | 174 ms | 522 ms |
| yash | 1579 ms | 382 ms | 952 ms |
| zsh | 1326 ms | 23 ms | 824 ms |
ãã¡ããããããã·ã§ã«ã¹ã¯ãªããå
éšã§è¡ã£ãŠãåŠçãéã£ãŠããããã§ æšæºå
¥åºåçµç±ã§ãã€ãã§èªã¿åããšããããã«ãéãããªåŠç ãããŠããæ¹ãé
ããªãã®ã¯ããæå³åœç¶ãªã®ã§ãããåçŽã«ãã€ãã䜿ã£ãŠãã°éããšããçºæ³ã§ãããšãã®çœ ã«é¥ããŸããïŒzsh ã® for ã¯éãããããŸããããïŒïŒ
è£è¶³ã§ãã pipe.sh ãš for.sh ã®çµæããéã for.sh ã®æ¹ãè¯ãããšèšããšãããšã¯éããŸãããfor.sh ã®å Žåã¯ããŒã¿ïŒseqïŒããã¹ãŠæããŸã§åºåãè¡ãããŸããã pipe.sh ã§ããã°ããã«åºåãéå§ãããŸããã¬ã¹ãã³ã¹ãè¯ãã®ã¯ pipe.sh ã®æ¹ã§ããïŒã§ããä»åã®äºäŸã§ã¯åããã¬ã¹ãã³ã¹ãè¯ã loop.sh ã®æ¹ã pipe.sh ããè¯ããšããçµæã«ãªã£ãŠãŸãããïŒ
åçŽã«ãã€ããé ãããšãããšãããã話ã§ã¯ãªãé ãã·ã§ã«ã¹ã¯ãªããã§èªã¿åã£ãŠããããã§ãã£ãŠã以äžã®ããã«å€éšã³ãã³ãã§èªã¿åããšéãã§ãã
# cat.sh
seq 100000 | cat
# awk.sh
seq 100000 | awk '{print}'
| pipe.sh | cat.sh | awk.sh | |
|---|---|---|---|
| dash | 443ms | 2.5 ms | 17.5 ms |
| bash | 1074 ms | 3.0 ms | 18.1 ms |
| ksh | 1228 ms | 3.2 ms | 16.1 ms |
| mksh | 695 ms | 2.6 ms | 17.7 ms |
| yash | 1579 ms | 2.8 ms | 17.8 ms |
| zsh | 1326 ms | 3.5 ms | 18.7 ms |
ã©ã®ã·ã§ã«ãåãé床ïŒèª€å·®ã®ã¿ïŒã«ãªãã®ã¯ãã·ã§ã«ã¹ã¯ãªããããã£ãŠãã®ã¯ã³ãã³ããèµ·åããã ãã§ãããšã¯å€éšã³ãã³ãã«ãã£ãŠåŠçãããŠããããã§ããã€ãŸãã·ã§ã«ã¹ã¯ãªããã¯ã»ãšãã©äœãããŠããŸããããªã®ã§ãã®çµæãæã£ãŠãã·ã§ã«ã¹ã¯ãªãããã¯éãïŒé ããªãïŒãšããçµè«ã«ããã®ã¯ãå人çã«ãªããéããªãšæã£ãŠããŸããïŒéãã®ã¯ Cèšèªã§äœãããå€éšã³ãã³ãã§ãã£ãŠã·ã§ã«ã¹ã¯ãªããã§ã¯ãªãããïŒ
ãªãç¹°ãè¿ãèšã£ãŠããŸãããå€éšã³ãã³ãã®åŠçèªäœã¯éããŠããå€éšã³ãã³ãã®åŒã³åºãã¯é ãã®ã§ã倧éã®ããŒã¿ãåŠçããªãå Žåã¯ã·ã§ã«ã¹ã¯ãªããèªäœã§åŠçããã»ããéãã§ãã
ãããŠè©±ãããã§çµãã£ãŠããããšãŸã 楜ã ã£ãã®ã§ããããã€ãã®å·ŠåŽïŒseqïŒãã·ã§ã«ã¹ã¯ãªããã§å®è£
ãããšç¶æ³ãå€ãã£ãŠããŸãã
# func_pipe.sh
func() {
i=0
while [ "$i" -lt 100000 ] && i=$((i+1)); do
echo "$i"
done
}
func | while IFS= read -r line; do
echo "$line"
done
# func_for.sh
func() {
i=0
while [ "$i" -lt 100000 ] && i=$((i+1)); do
echo "$i"
done
}
for line in $(func); do
echo "$line"
done
| pipe.sh | func_pipe.sh | func_for.sh | |
|---|---|---|---|
| dash | 443ms | 456ms | 768 ms |
| bash | 1074 ms | 1163 ms | 3638 ms |
| ksh | 1228 ms | 1991 ms | 531 ms |
| mksh | 695 ms | 699 ms | 2019 ms |
| yash | 1579 ms | 1548 ms | 3428 ms |
| zsh | 1326 ms | 1381 ms | 3394 ms |
ãŸã seq ã³ãã³ãã䜿ã£ãå ŽåïŒpipe.shïŒãšã·ã§ã«é¢æ°ã§å®è£
ããå ŽåïŒfunc_pipe.shïŒã§ã¯é床ãå€ãããŸãããããã¯ãã€ãã®å³åŽã®åŠçãé
ããã€ãã®ãããã¡ãåãŸã£ãŠ seq ã³ãã³ãã®åºåããããéããŠããããã¯ãããŠããŸã£ãŠããããã§ããseq 100000 åäœã®å®è¡ã§ããã° 1.2 ms ãšæ¥µããŠé«éã«åŠçãããŸãã
ãã®èšæž¬çµæã®çç±ã§ããæ£çŽãªæãªãæåã®äŸãšã¯éã®çµæãåºãŠãã®ãããããããŸãããã·ã§ã«ã¹ã¯ãªããã¯äžåºŠã«å€§éã®ã¡ã¢ãªã確ä¿ããåŠçãèŠæãšããããšã§ããããïŒãã€ãã䜿ã£ãŠã³ãŒããæžãã°äžè¡ããšã«ããŒã¿ãåŠçããã®ã§äžåºŠã«å€§éã®ã¡ã¢ãªã確ä¿ããå¿ èŠã¯ãããŸãããäžå¿èª¬æã¯ã€ããããªæ°ãããŸããã¡ãããšèª¿ã¹ãããŠããªãã®ã§çµè«ã¯åºããŸããããšããããæã蟌ã¿ã¯ãããŠèšæž¬ããŸããããšããããšã§ããã
ãŸãšã
ãã€ãã䜿ããšäžŠåå®è¡ãããã®ã¯äºå®ã§ããå®éããŸã䜿ãã°åŠçãæ©ãçµããããããšãå¯èœã«ãªããŸãã倧éã®ããŒã¿ã®å Žåã¯é ãã·ã§ã«ã¹ã¯ãªããã§ã¯ãªããã€ãçµç±ã§å€éšã³ãã³ãã«æž¡ããŠåŠçãããã»ããéããªããŸããããããã€ãã䜿ã£ãã³ãŒãã®ã»ããå¿ ãããéãããã§ã¯ãªãã®ã§äœãèããã«ãã€ãã䜿ã£ãŠãã°è¯ããšãããã®ã§ã¯ãªã䜿ãæã¯ã¡ãããšèããªããã°ãããŸãããã±ãŒã¹ãã€ã±ãŒã¹ã§å€æããªããã°ãããªããšãã身ãèããªãçµè«ã§ãã