ã¯ããã«
ã·ã§ã«ã¹ã¯ãªããã¯ã³ãã³ãããã€ãã§ã€ãªãã ãã§ç°¡åã«ãã€ãã©ã€ã³äžŠååãè¡ãããšãåºæ¥ãŸãããå¹çãã䞊ååŠçãè¡ãããã©ããã¯å¥ã®è©±ã§ããããã«ããã¯ããªãŒããŒããããããã®ã§åçŽã«ãã€ãã§ããã€ãã³ãã³ããã€ãªãã§ããã ãã§ç°¡åã«ã©ããŸã§ãå¹çãã䞊ååŠçãè¡ããããªããŠäºã¯æè¡çã«ããããŸããããããªã«ç°¡åãªãä»ã®èšèªã§ãæ¡çšããŠããã¯ãã§ãããã®èšäºã§ã¯ã·ã§ã«ã¹ã¯ãªããã§ãäœãèããã«ããã€ãã§ã³ãã³ãã倿°ã€ãªããã¹ã¿ã€ã«ã CPU æ§èœãå¹çãã䜿ãäžã§ã®ã¢ã³ããã¿ãŒã³ã§ããããšã瀺ãããã€ãã§ CPU ãå¹ççã«äœ¿ã£ãŠããã©ãŒãã³ã¹ããããã人ãç¥ããªããã°ãããªããã€ãã©ã€ã³äžŠååã®éèŠãªåºç€ç¥èãštime ã³ãã³ãã®èªã¿æ¹ã解説ããŸãã
ã³ãã³ãããã€ãã§ã€ãªãã§äžŠååŠçãè¡ããã€ãã©ã€ã³äžŠååã¯ç°¡åã«äœ¿ããŸããã䞊ååŠçã®ææ³ã®äžã§ãããããã£ãšãå¶åŸ¡ãé£ãããã®ã§ããå¶åŸ¡ãé£ããã®ã§ãã€ãã©ã€ã³äžŠååã§ CPU ã®æå€§å¹çãåŒãåºãããã«ã¯å€ãã®ç¥èãå¿ èŠã«ãªã£ãŠããŸããå¯èœã§ããã°ããŒã¿äžŠååãã¿ã¹ã¯äžŠååãšãã£ãä»ã®äžŠååæè¡ã䜿ãïŒäœµçšããïŒæ¹ãç°¡åã§å¹æãé«ãã§ãããããŠãããã®äžŠååæè¡ã䜿çšããŠããããèªç¶ãšäžŠåå®è¡ãè¡ãããã·ã¹ãã ïŒãµãŒããŒãµã€ãã®ãŠã§ãã·ã¹ãã çïŒã§ã¯ããã€ãã§å€æ°ã®ã³ãã³ããã€ãªãã¹ã¿ã€ã«ã䜿ã£ãŠããŸããšã䞊åèµ·åæ°Ããã€ãã§ã€ãªãã ã³ãã³ãæ°ããšããèšå€§ãªæ°ã®ããã»ã¹ãçæãšãã€ãééä¿¡ãè¡ãããŠããŸãéã«ã·ã¹ãã ã«éå°ãªè² è·ãäžããŠéããªã£ãŠããŸãå¯èœæ§ãããããŸããã€ãŸããã€ãã§å€æ°ã®ã³ãã³ããã€ãªãã¹ã¿ã€ã«ã¯ãCPU æ§èœã䜿ãåãããã«ã³ãã³ãã䞊åå®è¡ãããã·ã¹ãã èšèšãšçžæ§ãæªãããããã€ãã䜿ãã®ã¯çšã ã«ããŠãããšããã®ããã®èšäºã®çµè«ã§ãã
ãšã¯ããã·ã§ã«ã¹ã¯ãªããã«ãšã£ãŠãã€ãã¯ãªããŠã¯ãªããªããšãŠãéèŠãªæ©èœã§ãã®ã§ãããã¯åéãããªãã§ãã ãããç§ã¯ãã€ãã䜿ããªãšèšã£ãŠããã®ã§ã¯ãªããäžéå端ãªç¥èã§ãã€ãã䜿ãã®ã§ã¯ãªãããã€ãã®æ§è³ªãæ£ããçè§£ããŠãé©åã«"䜿ã"ããšèšã£ãŠããŸããïŒãšã¯èšã£ãŠãã·ã§ã«äžã§äœ¿ãå Žåã ããšãäœ¿ãæšãŠã®ã¹ã¯ãªãããªã©ã§ã¯ãããŸã§èããå¿ èŠã¯ãªããšæããŸãããïŒ
æ¬æ°ã§ãããªãã·ã§ã«ã¹ã¯ãªãã以å€ã®é©åãªèšèªã䜿ã
ããªãã§ã·ã§ã«ã¹ã¯ãªãããªããã«ããžã«ãªã£ãŠãã®ïŒãã£ãŠèšãããåã«èªåããå ã«èšããŸããã**䞊ååŠçãæ¬æ°ã§ãããããªãã·ã§ã«ã¹ã¯ãªããã§ã¯ãªãä»ã®é©åãªèšèªã䜿ã£ãŠãã ããã**ã·ã§ã«ã¹ã¯ãªããã§ã¯ããã»ã¹åäœã§ã®äžŠååïŒãã€ãã©ã€ã³äžŠååå«ãïŒããå©çšããããšãåºæ¥ãæ§èœãçç£æ§ãäœãã§ãã
ã·ã§ã«ã¹ã¯ãªããã®éç
äŸãã°ã·ã§ã«ã¹ã¯ãªããã§ã¯ OS ãåºæ¬æ©èœãšããŠæã£ãŠãã䞊ååæè¡ã® POSIX ã¹ã¬ãããããŸãšãã«äœ¿ãããšãåºæ¥ãŸãããOS ã«ã¯ããããªæè¡ãæèŒãããŠããŸããæ¬æ¥ã§ããã°ãããã®æè¡ãæ¯èŒæ€èšããŠæé©ãªæè¡ãéžæãã¹ãã§ããããããªããã·ã§ã«ã¹ã¯ãªããã§ã¯ OS ãæã£ãŠããåºæ¬çãªæ©èœã§ãã䜿ããªãããããã¯äœ¿ãã®ãå°é£ã§ãããšã䜿ãããšããŠãããã©ãŒãã³ã¹ãæªããããããæ¯èŒæ€èšããåºæ¥ãŸãããæ®å¿µãªããã·ã§ã«ã¹ã¯ãªããã®äžçã¯å©çšå¯èœãªæè¡ãå°ãªãã䜿ããæè¡ã ãã§é 匵ããšããäžçã§ããä»ã®èšèªã§ã¯ç°¡åã«å®çŸã§ããããšãã·ã§ã«ã¹ã¯ãªããã§ã¯å€§å€ã§ããããã¯ã·ã§ã«ã¹ã¯ãªãããå£ã£ãŠããããã§ã¯ãªãç¹å®ã®çšéã«æé©åãããèšèªã ããã§ããç¹å®ã®çšéã«æé©åãããŠããããã«èšèªæ©èœãå°ãããªã£ãŠããŸãããŸãã·ã§ã«ã¹ã¯ãªããã¯ããšããšå€§ããªãœãããŠã§ã¢ãäœãããã®èšèªã§ã¯ãªãããã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ãæŽåãããŠãããã倧ããªãœãããŠã§ã¢ãäœãããšãããš**èªåã§ã©ã€ãã©ãªïŒé¢æ°ãã³ãã³ãçïŒãäœãå¿ èŠãå€ããªãéçºã³ã¹ããé«ããªã£ãŠããŸããŸãã**ã·ã§ã«ã¹ã¯ãªããã¯å€ãã®ç°å¢ã§åæç¶æ ã§äœ¿ããã¹ã¯ãªããèšèªã§ãããããã»ããã¢ããã®æéããããªããšããã¡ãªããããããŸãããèšèªãã©ã€ãã©ãªã®ã»ããã¢ãããªããŠã³ãã³ããããã€ãå®è¡ããŠããã±ãŒãžãã€ã³ã¹ããŒã«ããã ãã§çµããç°¡åãªãä»äºã§ããä»ã¯é©åãªããŒãžã§ã³ã®èšèªãšã©ã€ãã©ãªãç°¡åã«ã€ã³ã¹ããŒã«ããä»çµã¿ããããŸãããä»ã¯ Docker ãªã©ã®ã¢ããªã±ãŒã·ã§ã³ã³ã³ããæè¡ã§ 1 ã³ãã³ãã§è€éãªæ§æã®ãµãŒãã¹ãé©åã«åããããšãå¯èœã«ãªã£ãŠããŸãã倧ããªãœãããŠã§ã¢ã¯ä»ã®èšèªã§äœã£ãæ¹ãã¯ããã«éçºã³ã¹ããäœãã§ããã·ã§ã«ã¹ã¯ãªããã§ã¯è«Šããªããã°ãªããªããããªæ©èœãç°¡åã«å®çŸããããšãã§ããŸãã**ã·ã§ã«ã¹ã¯ãªããã®äž»ãªåœ¹ç®ã¯å€§ããªãœãããŠã§ã¢ãäœãããšã§ã¯ãªããä»ã®èšèªã§äœããããœãããŠã§ã¢ïŒã³ãã³ãïŒãçµã¿åãããããšã§ãã**ã·ã§ã«ã¹ã¯ãªãããšä»ã®èšèªããã®äºã€ãçµã¿åãããã®ã§ãã
ä»ã®èšèªã¯ãã€ããããã»ã¹ã䜿ããªã
**ãã€ããšããã»ã¹ã¯ OS ã®åºç€æè¡ã§ããéèŠãªæè¡ã§ããæé«ã®æè¡ãšããããã§ã¯ãããŸãããèããŠãã¿ãŠãã ããããã€ããããã»ã¹ã¯ OS ã®åºæ¬æ©èœãªããã§ã·ã§ã«ã¹ã¯ãªããã ãã®ç¹æš©ãªã©ã§ã¯ãªãä»ã®èšèªããã§ã䜿ãããã®ã§ãããããã€ããããã»ã¹ãæé«ã®æè¡ã§ããã°ãä»ã®èšèªã§ãããããäžå¿ã«äœãããŠããã¯ãã§ãããããå€ãã®èšèªãã©ã€ãã©ãªã®å éšã§ãã€ããããã»ã¹ã䜿ãããšã¯ããŸããããŸããã䜿ããã®ã«äœ¿ããªããããããã€ããšããã»ã¹ãæé«ã®æè¡ã§ã¯ãªãããšã®ãªã«ããã®èšŒæ ã§ããããããã»ã¹ã䜿ããšããŒã¿ã®ããåãã«ããã»ã¹ééä¿¡ãå¿ èŠã«ãªããŸãïŒãã€ãéä¿¡ãããã»ã¹ééä¿¡ã®äžã€ã§ãïŒãããã»ã¹ééä¿¡ã¯åäžããã»ã¹ã§ã®ããåããããã³ã¹ããããããŸããã¹ã¬ããã«ãã䞊ååã¯ããã»ã¹ééä¿¡ãäžèŠãªãããäžè¬çã«ããã»ã¹ã«ãã䞊ååããæ§èœãé«ããªããŸãããŸã䞊ååŠçã«åŒ·ã Go ã«ã¯ã¹ã¬ããããã軜ã軜éã¹ã¬ãã (Goroutines) ãŸã§ãããŸããã¹ã¬ãããæ£ããæ±ãã®ã¯é£ããã§ããå€ãã®èšèªã«ã¯ãããã£ã䞊ååæè¡ãç°¡åã«äœ¿ãããã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªãååšããŠãããç°å¢ã®éããæèããããšãªãé«åºŠãªæ©èœãç°¡åã«äœ¿ãããšåºæ¥ãŸãã**ã·ã§ã«ã¹ã¯ãªããã§ã¯ããã»ã¹ã«ãã䞊ååããã§ããªãäžã«æ¬æ ŒçãªäžŠååŠçãããããšæã£ãããããã¯ãã¡ã€ã«ã䜿ã£ãæä»å¶åŸ¡ã CTRL-C ãæŒãããšãã®äžæåŠçãªã©ãèªåã§å®è£ ããªããŠã¯ãªãããšãŠã倧å€ã§ãããœãããŠã§ã¢æè¡ã¯ã·ã§ã«ã¹ã¯ãªãããèªçããæä»£ãããã¯ããã«é²ãã§ããããã§ãçŸä»£çãªä»ã®èšèªã®æ¹ãã¯ããã«çç£æ§ãé«ãã§ãããã€ããšããã»ã¹ã¯ OS ã®åºç€æè¡ã§ãããåºç€æè¡ããç¥ããªãããã§ã¯è©±ã«ãªããŸãããåºç€æè¡ãç¥ã£ãäžã§ãã®å ã®å¿çšæè¡ã䜿ããªããã°çç£æ§ãäžããããšã¯åºæ¥ãŸããã
ã·ã§ã«ã¹ã¯ãªããã§ä»ã®èšèªã®åãåºäžããã
ãã®èšäºã¯ã·ã§ã«ã¹ã¯ãªããããã€ãã©ã€ã³äžŠååãæé«ã®æè¡ã ãããšããçç±ã§è§£èª¬ããŠããããã§ã¯ãªãããããã䜿ã£ãŠã©ããã£ãŠããã©ãŒãã³ã¹ãåŒãåºãã®ããšãã話ãããŠããã«ãããŸãããã·ã§ã«ã¹ã¯ãªãããããã»ã¹ããã€ãã«åŒ·ãçç±ã¯ç°¡åãªèšè¿°ã§äœ¿ãããšãããã®äžç¹ã®ã¿ã§ãããããããã¯ãšãŠãéèŠãªããšã§ãããªããªãå šãŠã®èšèªã§äœã£ãã³ãã³ãã§ãã«ãã³ã¢ CPU ã®æ§èœãæè»œã«å©çšããããšãã§ããããã§ããä»ã®èšèªã§äžŠååæè¡ãç°¡åã«äœ¿ãããšèšã£ãŠããã¯ãé¢åããããã®ã§ãã䞊ååŠçãè¡ããªãã³ãã³ããäœãæ¹ãç°¡åã§ããã·ã§ã«ã¹ã¯ãªããã䜿ãã°ãããã®ã³ãã³ããç°¡åã«çµã¿åãããããšãåºæ¥ãŸããããã«ããã»ã¹åäœã®äžŠååããããŸãåãããã«ããããšã§**ä»ã®èšèªã§äœã£ãã³ãã³ãã®åãåºäžãããããšãåºæ¥ãŸãã䞊ååŠçãè¡ããªãã³ãã³ãã䞊åå®è¡ãããããããã³ãã³ãã飿ºãããããšãåŸæãªã·ã§ã«ã¹ã¯ãªããã®åœ¹ç®ã®äžã€ã§ãããã ãæ®éã«ãã€ãã䜿ãã ãã§ã¯ CPU ãå¹ççã«äœ¿ãããšã¯åºæ¥ãŸããã**ãããã€ãã©ã€ã³äžŠååã§ CPU ã®æå€§æ§èœãåŒãåºãããã®ã§ããã°ãã®èšäºãèªãã§ããŠãã ãããå®ã¯ãã®èšäºã¯ã·ã§ã«ã¹ã¯ãªããã®ããã®èšäºã®ããã§ãã£ãŠããã§ã¯ãããŸããããã®èšäºã¯ã·ã§ã«ã¹ã¯ãªããã®åã䜿ã£ãŠãä»ã®èšèªã§äœã£ãã³ãã³ãã§ CPU ãå¹çãã䜿ãããã®èšäºã§ãã
ãã®èšäºãæžãããšã«ããçµç·¯
ããŠå°ãäœè«ã«è¿ã話ã«ãªã£ãŠããŸããŸããããã®èšäºã¯ä»¥åæžããããã€ãã䜿ã£ãŠé«éåããã·ã§ã«ã¹ã¯ãªããã䞊åå®è¡ãããšéã«é ããªãè¬çŸè±¡ã«ã€ããŠãã®è§£çç·šãšãèšãããã®ã§ããæžãããšãããã£ããã¯ãã·ã§ã«ã¹ã¯ãªããã®å®éšã®ããã«äœã£ã POSIX æºæ awk å®è£ ã® JSON ããŒãµãŒ (SAX颚ã¹ããªãŒãã³ã°å¯Ÿå¿)ããæžããŠããæã«ãèšèšäžã®çç±ã§ãã€ãã䜿ãå¿ èŠãåºãŠããã®ã§ãå¯èœãªéã CPU ãå¹ççã«äœ¿ã£ãŠéããªãããã«èª¿æŽãè¡ããŸããããã®æã«ãã®è©±ãäŸã«ããŠèª¬æããã°åãããããã®ã§ã¯ãªããïŒãšæã£ãããã§ãã説æã®ããã ãã«ã§ã£ã¡äžããäŸã§ã¯äžèªç¶ã§çŸå®çã§ã¯ãªããã®ã«ãªããã¡ã§ãããã¡ããã©ããèŠæš¡ã§èª¬æã«åããäŸã¯ããããããŸãäœããŸããã
éåžžã§ããã°ç§ã¯ JSON ããŒãµãŒã®ãããªæ±çšã®ãŠãŒãã£ãªãã£ãŒå éšã§ãã€ãïŒãšããã䞊ååŠçïŒã䜿ãã®ã¯å¯èœãªéãé¿ããããšããŸããäŸãã°ãã®åã«äœã£ããã·ã§ã«ã¹ã¯ãªããã®å®éšã®ããã«äœã£ã POSIX æºæ awk å®è£ ã® CSVããŒãµãŒ (RFC4180察å¿)ãã§ã¯ awk ã¹ã¯ãªããäžã€ã ãã§æ§æãããŠããŸãããªãããšèšããšæ±çšã®ãŠãŒãã£ãªãã£ãŒã¯åããç°å¢ãæ³å®ã§ããªãããã§ããäŸãã°æ§èœãäœã 1 CPU ã®çµã¿èŸŒã¿æ©åšã§åãããããããŸãããæè¿ã®é«æ§èœããœã³ã³ã¯å€æ°ã® CPU ã³ã¢ãå©çšã§ããŸãããã¯ã©ãŠãã§ã¯ CPU ã³ã¢ã®å©çšã¯ã³ã¹ãã«çŽçµããã®ã§ããããŠå°ãªãã³ã¢ãæèŒããä»®æ³ãã·ã³ãè² è·ã«å¿ããŠãªãŒãã¹ã±ãŒã«ãããŠã³ã¹ãã®æé©åãè¡ãããšãäžè¬çã§ãã倿°ã® CPU ã³ã¢ ãæèŒãããç°å¢ãåæã«ããããšã¯åºæ¥ãŸããã
ãŸãããã«ãã³ã¢ CPU ã䜿ããå Žåã§ããæ±çšãŠãŒãã£ãªãã£ãŒã§äœ¿çšãã CPU ã³ã¢ãç¯çŽããã°ããŠãŒã¶ãŒã¯ä»ã®çšéã« CPU ã³ã¢ã䜿çšããããšãåºæ¥ãŸããäžèšã§èšããªãã°**ããããäžäŸ¿å©ã³ãã³ãã®ããã« CPU ãªãœãŒã¹ããã«ã«æã£ãŠããããšãããªã**ãšããããšã§ããããšãé床ãéãã£ããšããŠããããã ãã§ 32 ã³ã¢äœ¿ã£ãŠä»ã®åŠçãé ããªããããªã³ãã³ãã¯å«ã ãšæããŸããäŸãã° JSON ããŒãµãŒã¯ããã®åºåãåŠçããããã«ããã«å¥ã®ã³ãã³ãã«ãã€ãã§ã€ãªãããšãæ³å®ããŠããŸãããã®ãã JSON ããŒãµãŒã ãã§ CPU ã䜿ãåã£ãŠããŸã£ãŠã¯ãããŸãããä»®ã«ãŠãŒãã£ãªãã£ãŒããã«ãã³ã¢ CPU ã«å¯Ÿå¿ãããã®ã§ããã°ãããã©ã«ã㯠1 CPU ã§ã®åäœãšããªãã·ã§ã³ã§æå®ããå Žåã®ã¿äžŠååŠçãæ©èœãæå¹ã«ããŸãããã ä»åã® JSON ããŒãµãŒïŒæ£ç¢ºã«ã¯ä»åŸã®éçºäºå®ã®æ¹è¯çã®æ¹ïŒã§ã¯ãããè¡ãã®ãèšèšäžé£ãããå®è£ ããã®ã倧å€ãªã®ã§å éšçã«äºã€ã®ã³ãã³ãããã€ãã§ã€ãªãèšèšã«ããŠããŸãã
ãã€ãïŒäžŠååŠçã§CPUãå¹çãã䜿ãããã®ãåºç€ç¥èã
ããã ãèªãã°ååãšããå 容ããåºç€ç¥èããšããŠãŸãšããŸããããããåºç€ç¥èãã®å 容ã«çŽåŸããããªã人ã詳现ãç¥ããã人ã¯ãè©³çŽ°ãªæ€èšŒããèªãã§ãã ããã
ããã€ãã§ã€ãªããªããã®æå³
æåã«æç¢ºã«ããŠãããŸããããã®èšäºã§èšã£ãŠããããã€ãã§ã€ãªããªãããšããã®ã¯ããã€ãã§ã€ãªãã è€æ°ã®ã³ãã³ããäžã€ã«ãŸãšããããšããæå³ã§ãããäžæãã¡ã€ã«ã«æžãåºããŠè€æ°ã®ã³ãã³ãã«åããŠåŠçããã°ãã€ãã§ã€ãªãã§ãªãããªã©ã®æå³ã§ã¯ãããŸããã
äžæãã¡ã€ã«ãªã©ã䜿ã£ããé ããªãã®ã¯åœããåã§ãããã€ããé ããªãåå ã¯ãã€ãéä¿¡ã®ãªãŒããŒãããã§ããããã®ä»£ããã«ãã¡ã€ã«èªã¿æžããšãããã£ãšå€§ããªãªãŒããŒãããã䜿ã£ãããã£ãšé ããªãã®ã¯åœããåã§ãããã®èšäºã§èšã£ãŠããããã€ãã§ã€ãªããªãããšã¯ããã€ãã§ã€ãªãã è€æ°ã®ã³ãã³ããäžã€ã«ãŸãšããããšãã§ãåäžããã»ã¹ã§ã¡ã¢ãªå ã§ããŒã¿ãåŠçããããšã§ãã€ãééä¿¡ã®ãªãŒããŒãããããªããããšã§ãã
è«ãã蚌æ
ã³ãã³ãããã€ãã§ã€ãªããšãã€ãééä¿¡ãšã³ãã³ãåŠçã®ãªãŒããŒãããã«ãã£ãŠäœ¿çšãã CPU æéã¯å¿ ãå¢ããŸãããCPU æéãå¢ãããšããŠãäŒãã§ãã CPU ã³ã¢ã䜿ããã宿éãæ¹åã§ããããšããã®ã䞊ååã®æ¬è³ªã§ãã
# ããŒã¿çæ
$ cat /dev/urandom | base64 | head -n 1000000 > data.txt
# time ã³ãã³ãã®åºåã« CPU 䜿çšçãå ãã ïŒæ³šæ bash å°çšïŒ
# 泚æ2 macOS ã® /bin/bash ã¯å€ããŠãã°ãããããã§ CPU 䜿çšçãæ£ãã衚瀺ãããªã
$ TIMEFORMAT="real %3lR user %3lU sys %3lS cpu %P%%"
# ãã¿ãŒã³1 ãã€ãã§ã€ãªãå Žå
$ time cat data.txt \
| sed 's/a/A/g;' | sed 's/b/B/g;' | sed 's/c/C/g;' | sed 's/d/D/g;' \
>/dev/null
real 0m0.537s user 0m1.850s sys 0m0.215s cpu 384.87%
# ãã¿ãŒã³2 ãã€ãã§ã€ãªããªãå Žå
$ time cat data.txt \
| sed 's/a/A/g; s/b/B/g; s/c/C/g; s/d/D/g;' \
>/dev/null
real 0m1.360s user 0m1.336s sys 0m0.073s cpu 103.59%
ãã¿ãŒã³ 1ïŒãã€ãã§ã€ãªãã å ŽåïŒã¯ãã¿ãŒã³ 2ïŒãã€ãã§ã€ãªããªãå ŽåïŒããã CPU æé ïŒuser + sys) ãå¢ããŠããŸãã宿é (real) ã¯çããªã£ãŠããŸãã代ããã«äœèšã« CPU ã䜿ã£ãŠããïŒ4 ã³ã¢äž 384.87%)ããšã«æ³šæããªããã°ãããŸããã**ä»ã®ããšãããäœåãç¡ããªã£ãŠããŸãã**éã«èšãã°ãã¿ãŒã³ 2 ã§ã¯äœåãæãã®ã§ããã®åŠçãåæã« 3 ã€åããããšã§ 1 ã€ã®ããŒã¿ãåŠçããæéã§ 3 åã®ããŒã¿éãåŠçããäºãå¯èœã§ãã
ã¡ãªã¿ã«ãã®äŸã®ãã¿ãŒã³ 1 ã¯äžŠååã®å¹æãæãé«ãäŸã§ãããªããªãåã³ãã³ãã®åŠçæéãã»ãŒåçã ããã§ããçŸå®ã«ã¯ãã®ããã«éœåããåã³ãã³ãã®åŠçæéãã»ãŒåçã«ãªãããšã¯ãããŸããããã®çµæãããã€ãã§ã€ãªãããšã®å¹æããããé«ãããã«èŠããŠãããã¯éçŸå®çãªäŸã§ãããããŸããã
ããã§çŸå®çã«ãªãããã«ããã«ããã¯ãšãªã sed 's/[0-9]//g' ã远å ããŸãã
# ãã¿ãŒã³1 ãã€ãã§ã€ãªãå ŽåïŒããã«ããã¯ããïŒ
$ time cat data.txt \
| sed 's/a/A/g;' | sed 's/b/B/g;' | sed 's/c/C/g;' | sed 's/d/D/g;' \
| sed 's/[0-9]//g' >/dev/null
real 0m4.080s user 0m6.156s sys 0m0.493s cpu 162.97%
# ãã¿ãŒã³2 ãã€ãã§ã€ãªããªãå ŽåïŒããã«ããã¯ããïŒ
$ time cat data.txt \
| sed 's/a/A/g; s/b/B/g; s/c/C/g; s/d/D/g;' \
| sed 's/[0-9]//g' >/dev/null
real 0m3.789s user 0m5.194s sys 0m0.219s cpu 142.88%
ãããšåŠçæéã¯ç°¡åã«é転ããŠããŸããŸãããã®å Žåãã€ãã§ã€ãªãã ãã¿ãŒã³ 1 㯠ãã¿ãŒã³ 2 ã«æ¯ã¹ãŠå®æé (real) ã ãŠãŒã¶ãŒ CPU æé (user) ã ã·ã¹ãã CPU æé (sys) ãå¢ããŠããã®ã§äžã€ãã¡ãªããããããŸããããŸãå
çšã¯ 384.87% ã CPU ã䜿ã£ãŠããã®ã« 162.97% ãŸã§èœã¡ãŸããã远å ããããã«ããã¯ã® sed 's/[0-9]//g' ãããéãå®è¡ããããšãã§ããªãã®ã§ããã®ä»ã® sed ã¯äŒãã§ããç¶æ
ãšãªãããã€ãééä¿¡ãšã³ãã³ãã®åŠçãå€ãåããã¿ãŒã³ 1 ã®æ¹ãé
ããªã£ãŠããããã§ãããã¿ãŒã³ 2 ã®ããã«è€æ°ã®å°ããªåŠçãè¡ãã³ãã³ãã¯äžã€ã«ãŸãšããæ¹ãè¯ããšããçµæã«ãªã£ãŠããŸãã
åã³ãã³ãã® CPU 䜿çšçã®è©³çްãèŠãŠã¿ãŸããããïŒãã®ããã«ãããš /usr/bin/time ãåŒã³åºãããã®ã§åºåãå€ãã£ãŠããŸããïŒ
# ãã¿ãŒã³1 ãã€ãã§ã€ãªãå ŽåïŒããã«ããã¯ããã詳现çïŒ
$ cat data.txt \
| time sed 's/a/A/g;' \
| time sed 's/b/B/g;' \
| time sed 's/c/C/g;' \
| time sed 's/d/D/g;' \
| time sed 's/[0-9]//g' >/dev/null
0.48user 0.05system 0:03.90elapsed 13%CPU (0avgtext+0avgdata 2772maxresident)k
0inputs+0outputs (0major+129minor)pagefaults 0swaps
0.50user 0.04system 0:03.90elapsed 14%CPU (0avgtext+0avgdata 2632maxresident)k
0inputs+0outputs (0major+124minor)pagefaults 0swaps
0.56user 0.08system 0:03.90elapsed 16%CPU (0avgtext+0avgdata 2544maxresident)k
0inputs+0outputs (0major+127minor)pagefaults 0swaps
0.43user 0.08system 0:03.91elapsed 13%CPU (0avgtext+0avgdata 2764maxresident)k
0inputs+0outputs (0major+128minor)pagefaults 0swaps
3.89user 0.01system 0:03.91elapsed 99%CPU (0avgtext+0avgdata 2636maxresident)k
0inputs+0outputs (0major+127minor)pagefaults 0swaps
# ãã¿ãŒã³2 ãã€ãã§ã€ãªããªãå ŽåïŒããã«ããã¯ããã詳现çïŒ
$ cat data.txt \
| time sed 's/a/A/g; s/b/B/g; s/c/C/g; s/d/D/g;' \
| time sed 's/[0-9]//g' >/dev/null
1.47user 0.06system 0:03.79elapsed 40%CPU (0avgtext+0avgdata 2748maxresident)k
0inputs+0outputs (0major+137minor)pagefaults 0swaps
3.76user 0.03system 0:03.80elapsed 100%CPU (0avgtext+0avgdata 2836maxresident)k
0inputs+0outputs (0major+129minor)pagefaults 0swaps
ããã§èŠãŠããã ãããã®ã¯ CPU 䜿çšçã§ããããã«ããã¯ãšãªãã³ãã³ã㯠CPU ãã»ãŒ 100% 䜿çšããŠããããšãããããŸããããããã®ä»ã®ã³ãã³ãã¯ããã¿ãŒã³ 1 㯠13% ã 16%ïŒåèš 46%ïŒã§ããããã¯ããã«ããã¯ãšãªãã³ãã³ããããŒã¿ãåŠçãããããããã¡ãããµãããã®ä»ã®ã³ãã³ãã¯ããŒã¿åºåããããã¯ããå šåã§ããŒã¿ãåŠçã§ããªã = äŒãã§ããæéãå€ããªã£ãŠããããã§ããïŒæ³šæ CPU 1 ã³ã¢ã 4 ããã»ã¹ã§åå²ããŠäœ¿ã£ãŠãããã 13% ã 16% ã«ãªããšããæå³ã§ã¯ãããŸãããïŒ
ããããã«ããã¯ãæ¹åã§ããã°ãã®ä»ã®ã³ãã³ãã¯äŒãã§ããæéãæžã£ãŠ CPU 䜿çšçã¯å¢ããã§ãããã**ããã«ããã¯ã®åŠçã倿ŽããŠããã®ä»ã®ã³ãã³ãã® CPU 䜿çšçãå¢ããã®ã§ããã°ãããã¯æ¹åãããããšã«ãªããŸãã**ãã€ãã©ã€ã³äžŠååã§ã¯ããããã®ã³ãã³ããç¬ç«ããŠäžŠåã§åäœããŠããããã§ã¯ãªãããã€ãã©ã€ã³ãæµããããŒã¿ã«åæããŠåäœãããããããã«ããã¯ãšãªãã³ãã³ãïŒCPU 1 ã³ã¢ã 100% 䜿çšããŠããã³ãã³ãïŒã«ãã£ãŠããŒã¿ã®æµããæ»ããšããã以å€ã®ã³ãã³ãã¯ããŒã¿ãå±ããŸã§ã¯äŒãäºããã§ãã CPU ã¯éãã§ããŸããŸãïŒãã«ãã³ã³ãã¢åŒã®æµãäœæ¥ã§åãŸãã¯åŸã®äººã®äœæ¥ãé ããŠããã®äººã®äœæ¥ãçµãããŸã§æ¬¡ã«é²ããããªãç¶æ³ãæ³åããŠãã ããïŒã
ãã¿ãŒã³ 2 ãåæ§ã«ããã«ããã¯ãšãªãã³ãã³ãã§äŒãã§ããæéãçºçããŠããŸããããã€ãééä¿¡ãšããäœèšãªåŠçãããŠããªããããCPU 䜿çšçã¯ãã¿ãŒã³ 1 ã®åèš 46% ãããå°ãªã 40% ã§æžãã§ããŸãã**ããã«ããã¯ã®åŠçã¯å€æŽããã«ããã®ä»ã®ã³ãã³ãã® CPU 䜿çšçãæžã£ãã®ã§ããã°ãããã¯æ¹åãããããšã«ãªããŸãã**CPU 䜿çšçã ããèŠãã°å ã»ã©ãšèšã£ãŠããããšãæ£å察ã«ãªã£ãããã«èŠããŸãããããã¯ããã«ããã¯ãšãªãã³ãã³ãã®å®è¡æé ïŒreal = user + sys) ãåºæºïŒãã®ä»ã®ã³ãã³ãã® real ãšçããïŒãšããŠãã®ä»ã®ã³ãã³ãã® CPU 䜿çšçãç®åºãããŠããããã§ãããCPU 䜿çšçãå€ãã£ãåå ãç°ãªãããã§ããåã ã®ã³ãã³ãã®æ§èœãèŠãå Žå㯠CPU 䜿çšçã§ã¯ãªã user/sys ãèŠãã»ããåãããããã§ãããããã€ãã©ã€ã³å šäœã® real ãšåã ã®ã³ãã³ãã® real ãšäžèŽããŸãããå šäœã® user/sys ã¯åã ã®ã³ãã³ãã®åèšã«ãªããšããéãã®æå³ã«ã泚æããŠãã ããã
ãšããããšã§ãããã®è©±ããã€ãã©ã€ã³äžŠååã§ CPU ãå¹çãã䜿ãããšã®é£ããã§ããåã sed ã³ãã³ãã§ãè¡ãå
容ã«ãã£ãŠåŠçé床ã¯éããŸãããŸãä»ã®ã³ãã³ãã ãšã©ããªãã§ããããïŒåãã³ãã³ãã§ãç°å¢ãéãã°å®è£
ãç°ãªããŸããäžç¢ºå®èŠçŽ ãå€ãããã©ã®ããã«ããã°æãå¹çãè¯ããã¯äžæŠã«ã¯èšããŸãããtime ãåã«æ°åã®å€§å°ã ããçºããŠããã°è¯ãããã§ã¯ãªãããã®æå³ãæ£ãã倿ããã®ã¯çµæ§é£ããã§ãã
䞊ååŠçãèªããªãtimeã®user/sysãç¡èŠããŠã¯ãããªã
ã¿ãªãã㯠time ã³ãã³ãã䜿ã£ãããšãããã§ããããïŒããã©ã«ãã§ã¯ä»¥äžã®ããã«åºåãããã§ããããã·ã§ã«ã«ãã£ãŠã¯ãã«ãã€ã³ã³ãã³ãã§ããããã䜿ã£ãŠããã·ã§ã«ã§åºåãç°ãªãå ŽåããããŸãã
# POSIX æºæ ã®å Žå
$ /usr/bin/time -p sleep 1
real 1.00
user 0.00
sys 0.00
# bash ã®å Žå
$ time sleep 1
real 0m1.008s
user 0m0.001s
sys 0m0.002s
# zsh ã®å Žå
$ time sleep 1
sleep 1 0.00s user 0.00s system 0% cpu 1.008 total
time ã³ãã³ã㯠POSIX ã§ãæšæºåãããŠããã³ãã³ãã§ã-p ãªãã·ã§ã³æå®æã¯å°ãªããšã real/user/sys ã® 3 ã€ã®å€ãåºåãããããšã«ãªã£ãŠããŸãããªããããã®å€ãåºåãããããšããã°ããã¡ãã real/user/sys ãç¹ã«éèŠãªå€ã ããã§ãã
- real - 宿éãå®éã«æãã£ãæé
- user - ãŠãŒã¶ãŒ CPU æéãã³ãã³ãã®åŠçã«æãã£ãæéã
- sys - ã·ã¹ãã CPU æéãã·ã¹ãã ã³ãŒã«ã«æãã£ãæé
CPU ã 1 ã³ã¢ãããªãå ŽåïŒãŸã㯠1 ã³ã¢ãã䜿ã£ãŠãªãå ŽåïŒã¯ real 㯠user + sys + åŸ
ã¡æéã«ãªããŸããåŸ
ã¡æéãšã¯ I/O ïŒãã£ã¹ã¯æžã蟌ã¿ããããã¯ãŒã¯éä¿¡ããã€ãéä¿¡ïŒã«ããåŸ
ã¡æéã§ CPU ãäœãããŠãªãã£ãïŒã¢ã€ãã«ç¶æ
ïŒæéã§ããäžèšã® sleep 1 ã CPU ã¯äœãããªãã§åŸ
ã£ãŠããã ããªã®ã§ãreal 㯠1 ç§ã§ãã user ãš sys ã¯ãšãã«ããããããªæéã«ãªã£ãŠããŸãããŸã user 㯠real ãè¶
ããäºããããŸããããã¯ãã«ãã³ã¢ CPU ç°å¢ã§äžŠååäœãè¡ã£ãŠããå Žåã§ããã®èšäºãäž»ã«çŠç¹ãåœãŠãŠããéšåã§ãã
䞊ååŠçãšããã®ã¯ user/sys ãå¢ããããšã§ real ãçãããæ¹æ³ãšèšãæãããããããããŸãããããã user/sys ã¯ç¡é§ãªåŠçã«ãã£ãŠãå¢ããŠããŸãã®ã§ãuser/sys ãå¢ãã = è¯ããªã£ãããšã¯éããŸãããäŸãã°ã³ãŒããä¿®æ£ã㊠real ãåãã§ user/sys ãå¢ãããšããå Žåã¯æ§èœãèœã¡ãããšãæå³ããŸããïŒããã«ããã¯ä»¥å€ã®ã³ãã³ããäœèšã« CPU ãæ¶è²»ããŠããç¶æ ïŒ
ãã®ããã«äžŠååŠçãè¡ãããŠããå Žå㯠real ã ããèŠãŠãæå³ããªã user/sys ãç¡èŠãããããŠã¯ãããŸãããå šãŠã®å€ãèŠãŠãç·åçã«èããŠè¯ããªã£ãŠããã®ããæ€èšããå¿ èŠããããŸããäŸãã° real ã 10 % è¯ããªã£ãåé¢ user/sys ã®æéã 2 åã«ãªã£ãå Žåãç·åçã«èããŠè¯ããªã£ããšå€æãã¹ããã¯é£ããåé¡ã§ãããã®ãããªã¹ã¯ãªããã CPU ã 1 ã³ã¢ããæèŒããŠãªãç°å¢ïŒãŸã㯠1 ã³ã¢çžåœåããäœåããªãç°å¢ïŒã§å®è¡ãããš real 㯠user + sys ïŒã€ãŸã 2 åïŒã«ãªã£ãŠããŸããŸãã
ã宿éãçãæ¹ãè¯ãã«æ±ºãŸã£ãŠããã¯ééãã§ãã
ãããšããŠãŒã¶ãŒ CPU æé (user) ãã·ã¹ãã CPU æé (sys) ãå¢ããŠããŠã宿é (real) ãçãã»ããè¯ãã®ã§ã¯ãªããïŒãã¯ããäžè¬çã«ã¯ããã ãšæããŸããããã¹ãŠãããšã¯éããŸãããäŸãã°ãã€ãã©ã€ã³äžŠåå以å€ã®äžŠååæè¡ã䜿ãïŒäœµçšããïŒå Žåã§ãã
å
·äœçã«èšããš xargs -Pãmake -jãGNU parallel çã䜿ã£ãããã·ã§ã«ã¹ã¯ãªããã®ããã¯ã°ã©ãŠã³ãå®è¡ã䜿ã£ãŠããã»ã¹åäœã®äžŠååãè¡ãå Žåããpigz ã®ããã«å
éšã§ã¹ã¬ããã䜿ãã³ãã³ãã䜿çšããå Žåã§ãããŸããŠã§ãã·ã¹ãã (CGI) çã®ããã«ã¢ã¯ã»ã¹åäœã§ç¬ç«ããããã»ã¹ãèµ·åããå Žåã«ãããŠã¯ãŸããŸããïŒå¿µã®çºã§ãã FastCGI ã䜿ã£ãŠãã·ã§ã«ã¹ã¯ãªããã§ã¯ããã©ãŒãã³ã¹ãæ¹åããããšã¯ã§ããŸãããã·ã§ã«ã¹ã¯ãªããã®èšèªä»æ§äž FastCGI ã«å¯Ÿå¿ããèœåããªããã¹ã¯ãªããå
éšã§å€éšã³ãã³ããèµ·åããã®ã§æå³ããªãã®ã§ãã詳ããã¯ãFastCGI shell scriptããåç
§ããŠãã ãããããã¯ã·ã§ã«ã¹ã¯ãªããã䜿ã£ãŠå€§èŠæš¡ãªãŠã§ãã·ã¹ãã ãäœãã¹ãã§ã¯ãªãçç±ã®äžã€ã§ããïŒ
ãããã£ã**ããã€ãã©ã€ã³äžŠåå以å€ã®äžŠååæè¡ã䜿ãïŒäœµçšããïŒå Žåãã§ã¯ããã€ãã©ã€ã³äžŠååã¯éèŠæ§ãäœããªããå Žåã«ãã£ãŠã¯é广ã«ãªã£ãŠå®æéãé·ããªãå¯èœæ§ããããŸãããªããªããã€ãã©ã€ã³äžŠååã§å®æéãçããªãã®ã¯ãäœãããŠããªã CPU ã³ã¢ãäœã£ãŠãããšããåæããã£ãŠåããŠæãç«ã€ãã®**ã ããã§ãã
ä»ã®äžŠååæè¡ã䜵çšããå Žåã䞊åã§èµ·åããã³ãã³ãæ°ãå¢ããã ãã§ç°¡åã« CPU ã³ã¢ã䜿ãåãäºãã§ããŸããCPU ã³ã¢ãäœã£ãŠãªãç¶æ³ã§ã¯ä»ã® CPU ã«åŠçãå²ãæ¯ãäºãã§ããŸããã1 ããã»ã¹ã§å®è¡ã㊠user/sys ã real ãè¶ ããŠããç¶æ³ãšããã®ã¯ãè€æ°ã® CPU ã³ã¢ã䜿ã£ãŠãããšããããšã§ããããå²ãæ¯ãä»ã® CPU ã³ã¢ããªãç¶æ³ã§ã¯ãèªåã§åŠçãããããªãããããã£ãŠå®æé (real) ã®å¢å ãšããŠè·³ãè¿ã£ãŠããŸãã1 ããã»ã¹ã ãå®è¡ããŠã³ãã³ãã®å®è¡ãéãå®äºãããããéããªã£ãããšçµè«ãã ãããšã¯æããã«èå¯ãè¶³ããè©°ããçããšèšããããåŸãŸããã
䞊ååŠçã§ CPU ãå¹ççã«äœ¿ãåãããã®ã§ããã°ã宿é (real) ã ããèŠãã®ã§ã¯ãªãããã«ãã³ã¢ CPU ã®åœ±ã«é ããŠãã CPU æéã®å¢å (user/sys) ã«ãæ°ãé ããªããã°ãããŸãããã§ãªããã°ãCPU ã䜿ãåããã©ããããããŒã¿åŠçé床å€ãããªãã®ã« CPU äœ¿çšæéã ããå€ããªã£ãŠããŸãç¶æ³ãã€ãŸããCPU ãäœ¿ãæœ°ããããšã«ãªã£ãŠããŸããŸãã
ãuser+sys ãå€ãæ¹ã䞊ååã®å¹æãé«ããã¯ééãã§ãã
ãããªå±çå±ããããŸãããuser+sys ã real ãè¶ ããç¶æ ãšããã®ã¯äžŠååãããç¶æ ã§ãããã€ãŸã CPU ã³ã¢ãè€æ°äœ¿ã£ãŠããããšãæå³ãããã ãã user+sys ãå€ããã°å€ãã»ã©äžŠååã®å¹æãåºãŠããã䞊ååãããŠããã®ã§ããã©ãŒãã³ã¹ãé«ãããã©ããããããã®ããããã§ããããïŒ
ãããŸã§ã®è©±ã§ãã§ã«èª¬æããŠããããšã§ãããåºæ¬çã« user/sys ã¯äœããã°äœãã»ã©è¯ãã§ããuser/sys ã¯ç¡é§ãªåŠçãããŠãå€ããªããŸããuser/sys ã real ãè¶ ããŠããæã«äžŠååãããŠããã®ã¯äºå®ã§ããã䞊ååãããç¶æ ã§ãã£ãŠã user/sys ãå°ãªãæ¹ãè¯ãããšã«å€ããã¯ãããŸãããuser/sys ã real ãè¶ ããŠãããšããã®ã¯åã«ã䞊ååãããŠããããšããäºå®ãããã ãã§ãå¹çãã CPU ã䜿ãåã£ãŠãããã©ãããšã¯å¥åé¡ã§ãã**ç®çã¯ããã©ãŒãã³ã¹ãäžããããšã§ãã£ãŠäžŠååããïŒCPU ã³ã¢ãå€ãïŒããšã§ã¯ãããŸããã**䞊ååããããããšãã£ãŠããã©ãŒãã³ã¹ãäžãã£ããšã¯éããŸããã
æ£ããèãæ¹ãæç€ºããŸãããã**ãuser/sys ãå¢ãããšããããšã¯ããã©ãŒãã³ã¹ãäžãããšããããšã§ãããããããããå¹çããè€æ°ã³ã¢ã® CPU ã«æ¯ãåã㊠real ãæžããããšãã§ããã°ãè€æ°ã® CPU ã³ã¢ãå©çšã§ããç°å¢ã§ã¯ã¡ãªããã«ãªãå¯èœæ§ãé«ããã**ã§ããuser/sys ãšããã³ã¹ããæ¯æãã©ãã ã real ãæ¹åã§ãããããã®ã³ã¹ãå¯Ÿå¹æãèŠæ¥µããã®ã䞊ååã®å¹æãèŠæ¥µãããšããããšã§ãã广 (real) ã ããèŠãŠããŠã¯ãã¡ã§ã³ã¹ã (user/sys) ã¯å°ãªãæ¹ãè¯ãã®ã§ãã
ãã€ãã©ã€ã³äžŠååã¯ããã«ããã¯ãšã®æŠã
ãã€ãã§ã€ãªãã å šãŠã®ã³ãã³ãã¯åæã«èµ·åããŸãããããŒã¿ãå°çãããŸã§ã¯åŸ ã¡ç¶æ ã«ãªããŸããããŒã¿ã®æµããšåæããŠåããŠãããããåã®ã³ãã³ãããããŒã¿ãå±ããŸã§ã¯äœãããŠããã䞊åã§å®è¡ããç¶ããŠãããšã¯éããŸããããã€ãã©ã€ã³ã®éå¹çãªäœ¿ãæ¹ã¯ãå°ããªåŠçããè¡ããªãåçŽãªã³ãã³ããããã€ããã€ãã§ã€ãªãã§ããŸãããšã§ããå°ããªåŠçããè¡ããªãéšåãããã«ããã¯ã«ãªãããšã¯ãããŸãããããã§ããããã«ããã¯ãšã¯ããŒã¿åŠçã«æéããããå ¥åãè¡ãããŠããåºåãŸã§æéãèŠããã³ãã³ãã®ããšã§ããæ¬¡ã®ã³ãã³ãã«ããŒã¿ãéããŸã§æéããããã®ã§ããã®éã«æ¬¡ã®ã³ãã³ãã¯æ©ãåŠçãæžãã§ããŸãæã空ããŠããŠãããŒã¿ãå°çãããŸã§äœãåºæ¥ãã«åŸ ã¡ç¶æ ã«ãªããŸãããã€ãã©ã€ã³å šäœã®å®è¡æéã¯ããã«ããã¯ã«ãã£ãŠæ±ºãŸããŸããããã«ããã¯ãšãªãé ãã³ãã³ããæ¹åããªããã°ãã€ãã©ã€ã³å šäœã®å®è¡æéãçããªãããšã¯ãªããå°ããªåŠçããè¡ããªãã³ãã³ããããã€ããã€ãã§ã€ãªãã æã§ãã€ãééä¿¡ãã³ãã³ãã®åŠçã§ç¡é§ã« CPU äœ¿çšæéãå¢ãããŠããŸãã ãã§ããããããã«å°ããªåŠçããè¡ããªãã³ãã³ãã¯ãŸãšããŠããŸããŸããããšãã話ã§ãã
åºæ¬çã« tr ã grep ã®åŠçïŒã®äžéšïŒã¯ sed ã«çœ®ãæããããšãã§ããŸããè€æ°ã® sed ã grep ã¯äžã€ã® sed ã grep ã«ãŸãšããããšãåºæ¥ãŸãããããŠè€æ°ã® tr ã grep ã sed ã¯äžã€ã® awk ã«çœ®ãæããããšãã§ããŸãã眮ãæãå
ã®èšèªã¯ awk ã«éå®ããå¿
èŠããªã Perl ã Python ãªã©ã®ã¹ã¯ãªããèšèªãC èšèªã Go ãšèšã£ãã³ã³ãã€ã©èšèªã«çœ®ãæããããšãåºæ¥ãŸãããããã£ãŠãã€ãã§ã€ãªãã è€æ°ã®ã³ãã³ãã¯äžã€ã®ã³ãã³ãã«ãŸãšããããšãå¯èœã§ãã
ãŸãå
šãŠã®åŠçãäžã€ã®ã³ãã³ãã§è¡ããšããŸããããããªãŒããŒãããã®ãªã CPU äœ¿çšæéãäžçªå°ãªãç¶æ
ã§ãããããã¹ã¿ãŒãå°ç¹ãšããŸãããããŠããã€ãã䜿ã£ã䞊ååŠçãè¡ãããšã§å®æéãçãã§ããã°ã¡ãªããã§ã¯ãªããïŒããšèããŸãããã1 ã€ã®ã³ãã³ãã 2 ã€ã®ã³ãã³ãã«åããæ®µéã§ã¯ã广ã®å€§å°ã¯ãšããã宿éã¯çããªããŸããããã以äžã«åããå Žåã¯ããã«ããã¯ã«ãªã£ãŠããéšåãæ¢ãå¿
èŠããããŸããããã«ããã¯ã«ãªã£ãŠãªãæãåå²ããŠã宿éã¯çããªãããç¡é§ã« CPU æéãå¢ããã ãã§ããããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ã¯èšæž¬ãªãã«ãã£ãŠã¯ãããŸãããtime ã³ãã³ãã® real/user/sys ã®å
šãŠãèŠãŠããã«ããã¯ã«ãªã£ãŠãéšåã調ã¹ãã®ãæåã®äžæ©ã§ãã
ãã¡ãããã¹ãŠãäžã€ã®ã³ãã³ãã«ãããšãã話ã§ã¯ãããŸãããç¬ç«ããã圹å²ãã®åäœã§ã³ãã³ããäœæããŸãããããããšäžã€ã®ãã€ãã©ã€ã³ã§ã¯ 3 ã 5 åãããã®ã³ãã³ããã€ãªãçšåºŠã«åãŸãã§ãããããããé©åãªç®å®ã§ããã**äœååãã®ã³ãã³ãããã€ãã§ã€ãªãã®ã¯æããã«ã¢ã³ããã¿ãŒã³ã§ãã**æ®éã«äœãã°äœååãã³ãã³ãããã€ãã§ã€ãªããããªäºã«ã¯ãªããªããšæããŸããããããªç¶æ ã«ãªããšãããããã«ããã¯ã«ãªã£ãŠãªãæãŸã§å°ããªã³ãã³ãã«åå²ããŠãå Žåãããããèãããããç¡é§ã« CPU äœ¿çšæéãå¢ãããŠããã ãã«ãªã£ãŠããŸãã
ãã€ãã©ã€ã³ã®ãå€éšã³ãã³ããèµ·åããã®ã¯é ãã
ãã®èšäºã§ã¯è©³ããæ±ããŸããããå€éšã³ãã³ãã®èµ·åã¯æ¯èŒçéãåŠçã§ãããŸãã·ã§ã«é¢æ°ã§ãã£ãŠããã€ãã§ã€ãªããšäžéšã®äŸå€ãé€ããµãã·ã§ã«ã«ãªã£ãŠããŸãããããããéãåŠçãšãªã£ãŠããŸããŸãã
å®éã«ã³ãã³ãã®èµ·åã«ã©ãã ãããããã¯ã³ãã³ããšç°å¢ã«ãããŸãããäœãããªãã³ãã³ãïŒ/bin/trueïŒ ã§ 1 msãawk ã ãš 3 ms ãèµ·åããã ãïŒåŠçæéã¯å«ããŠããŸããïŒã§ããããšããã®ãç§ã®æèŠã§ããïŒå
éšçã«ã¯ fork 0.5 msãexec 0.5 msããµãã·ã§ã«ã¯ fork ã ããªã®ã§ 0.5 msïŒ
1 ã³ãã³ããããã®èµ·åæéã¯æ°ããªç§ãšçãã§ãããåŒã³åºãã³ãã³ãã®æ°ãäœååã«ããªããšã100 ms ãªããŠç°¡åã«è¶
ããŠããŸãããã®ãããããé
å»¶ãæããŠããŸããæ°çŸãæ°ååç¹°ãè¿ãã«ãŒãã®äžã§é »ç¹ã«åŒã³åºããŠãããšç¡èŠã§ããªãããã©ãŒãã³ã¹åé¡ãåŒãèµ·ãããŸãããã€ãã©ã€ã³ã ãã§ã¯ãªããäŸãã°ã³ãã³ã眮æïŒret=$(echo "$var" | sed ...) ã¿ãããªãã®ïŒã®ããã«ãµãã·ã§ã«ãå€éšã³ãã³ãèµ·åã«ãªããã®ãã«ãŒãã®äžã§äœåºŠãå®è¡ããŠããŸãã®ãã·ã§ã«ã¹ã¯ãªãããéãããŠããŸãäžçªã®åå ã§ãã
ã·ã§ã«ã¹ã¯ãªããã§å¹çããåŠçãè¡ãã«ã¯ã¹ããªãŒãã³ã°åŠçãæèããæžãæ¹ãã³ãã³ãèšèšãå¿
èŠãšãªããŸããã¹ããªãŒãã³ã°åŠçãšã¯äœãªã®ããšãã話ã¯å¥ã®èšäºã§è§£èª¬ããããšæããŸãããåã«ãã€ãã§ã³ãã³ããã€ãªãã§ããã°ã¹ããªãŒãã³ã°åŠçãããŠããããšã«ãªãããã§ã¯ãªããã¹ããªãŒãã³ã°åŠçã劚ãã sort ã³ãã³ãããã¹ããªãŒãã³ã°åŠçããããåŠçã«å€æãã xargs ã³ãã³ããªã©ãããã®ã§æ³šæãå¿
èŠã§ããã¹ããªãŒãã³ã°åŠçãæ£ããçè§£ããããšãã·ã§ã«ã¹ã¯ãªããã§å¹çããåŠçãè¡ãããã®éèŠãªèãæ¹ã§ãã
倿°ã®ã³ãã³ãããã€ãã§ã€ãªããšå¯èªæ§ãäœããªã
ããã¯ããã©ãŒãã³ã¹ã®è©±ã§ã¯ãããŸãããã倿°ã®ã³ãã³ãããã€ãã§ã€ãªããšå¯èªæ§ãäœããªããšããããšã«çæããå¿ èŠããããŸãããªããããæžãã®ããšèšããšããã®èšäºãèªãã§ãCPU ã®æå€§æ§èœãåºãã«ã¯ãããããšèããªããã°ãããªãããšã¯ããã£ããã©ããããŸã§äœã蟌ããããããªãããããšãããããã€ãã§ã€ãªãã§çœ®ãã°è¯ããã ãããšèããŠããŸã人ãžã«å¯ŸããŠã®èŠåã§ãããšãããããã€ãã§ã€ãªãã§ããŸããšå¯èªæ§ãšã¡ã³ããã³ã¹æ§ãäžãã£ãŠããŸããŸãã
倿°ã®ã³ãã³ãããã€ãã§ã€ãªãã¹ã¿ã€ã«ïŒâ äœæ¥ãã³ãã³ãå ¥åäžæã§çµããããïŒããããã§ã¯ã·ã§ã«èžã¹ã¿ã€ã«ãšåŒã°ãããŠããã ããŸãããããããã¹ã¿ã€ã«ã¯å¯èªæ§ãäœããªã£ãŠããŸããŸããã·ã§ã«äžã§å®è¡ããã ããšããäœ¿ãæšãŠã®ã¹ã¯ãªããã§ã¯ã·ã§ã«èžã¹ã¿ã€ã«ã§ãè¯ããšæããŸãããèªå以å€ã®äººãã¬ãã¥ãŒãããå°æ¥ã¡ã³ããã³ã¹ããå Žåã¯å¯èªæ§ãèæ ®ããæžãæ¹ãããªããã°ãããŸãããèªåãã¡ã³ããã³ã¹ããå Žåã§ããã°ããçµã£ãŠããã³ãŒããèŠãæãããã§äœããã£ãŠãã®ãïŒãšæ©ãŸãªããã°ãããªãã³ãŒãã¯ãããããŸããã
ã·ã§ã«èžã¯ããšããšã¹ã¯ãªãããã¡ã€ã«ã«ããªãäœ¿ãæšãŠã®ãã®ã ã£ãã¯ãã§ããåŸã§èªãããšããªãã®ã ããå¯èªæ§ãäœããŠãèš±ãããŠããŸããããããã¹ã¯ãªããã«ããŠã¯ãããŸããããã€ãã§ã倿°ã®ã³ãã³ãããã€ãªãããšã«ã¡ãªããããªããå¯èªæ§ãäœããšãããã¡ãªãããããã®ã§ããã°ããã€ãã§ã€ãªãã³ãã³ãã®æ°ã¯ããããã«ããŠããã®ããã¹ããªã®ã§ãã詳ããã¯ä»¥äžã®èšäºãåèã«ããŠãã ããã
è©³çŽ°ãªæ€èšŒ
æ€èšŒã¹ã¯ãªããã®èª¬æ
誰ã§ãåæ€èšŒããããããã«ããœãŒã¹ã³ãŒããšããŒã¿ããã®ãªããžããªã«ã¢ããããŒãããŠããŸããå®è¡æéã®è¡šç€ºã« bash ãã«ãã€ã³ã® time ã³ãã³ãïŒè¡šç€ºã®ã«ã¹ã¿ãã€ãºãå¯èœã§ãã€ãã©ã€ã³å
šäœãã·ã§ã«é¢æ°ã®æéãèšæž¬ã§ãããªã©é«æ©èœïŒã䜿çšããŠãããã bash ãå¿
èŠã§ãããã ã macOS ã®å€ã bash 㯠time ã³ãã³ãã«ãã°ãæãããã§ CPU 䜿çšçãæ£ãã衚瀺ãããŸãããHomebrew ã§æ°ãã bash ãã€ã³ã¹ããŒã«ããŠãã ããã
æ€èšŒã¹ã¯ãªãã㯠awk ã§å®è£ ãã JSON ããŒãµãŒã§ããå®è¡ãããšãã®ãããªãã°ãåºåãããŸãã
$ $ cat test.json | AWK=/usr/bin/original-awk ./parsejson.sh > /dev/null
bash version: 5.0.17(1)-release
awk: /usr/bin/original-awk
tokenize awk: real 0m4.773s user 0m2.894s sys 0m0.114s cpu 63.02%
parse awk: real 0m4.786s user 0m4.241s sys 0m0.544s cpu 99.98%
---------------------------------------------------------------------------
ALL: real 0m4.787s user 0m7.135s sys 0m0.659s cpu 162.83%
ç°å¢å€æ° AWK ã§äœ¿çšãã awk ã®å®è£
ïŒãã¹ïŒãæå®ããããšãåºæ¥ãŸããäžèšã¯ Ubuntu ã§å®è¡ããŠããŸããoriginal-awk ãšããã®ã¯ nawk (new awk ãŸã㯠one true awkïŒã®ããšã§ããLinux ã§ã¯ããã©ã«ãã§ nawk ã䜿ãããããšã¯ãªããšæããŸãããmacOS ã FreeBSD ã Unix ãªã©ã§åºã䜿ãããŠããŸãã説æã®éœåäž nawk ã®è©±ããå§ããŠããŸãã
JSON ããŒãµãŒã¯å€§ããäºã€ã®éšåã§æ§æãããŠããŸããäžã€ã¯ tokenizer (tokenize 颿°) ã§ JSON ãæ§æããããŒã¯ã³ã«åå²ããŠäžè¡ããšã«åºåããŸããäŸãã°ãã®ãã㪠JSON ãã¡ã€ã«ã®å Žåã
{"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}}
ãã®ããã«åºåãããŸããJSON ãã¡ã€ã«ã¯æ¹è¡åºåãã§ãªãäžè¡ã® JSON ã®å¯èœæ§ãããããšãèžãŸããŠã" åºåããšããŠèªã¿åãããšã§å°ããåäœã§ã®ã¹ããªãŒãã³ã°åŠçã§ã®ããŒã¹ãå®çŸããŠããŸãã
{
"menu"
:
{
"id"
:
"file"
,
"value"
:
"File"
,
ïž
ããäžã€ã¯ parser (parse 颿°) ã§äžèšã®å
¥åãå
ã«æ¬¡ã®ããã«ããŒã¹ãã JSON ã®çµæãåºåããŸãããã®åºå㯠jsoncallbask.awk ã§ã«ã¹ã¿ãã€ãºããããšãåºæ¥ãŸãã
@ <=> {
@."menu" <=> {
@."menu"."id": "file"
@."menu"."value": "File"
@."menu"."popup" <=> {
@."menu"."popup"."menuitem" <=> [
@."menu"."popup"."menuitem".0 <=> {
@."menu"."popup"."menuitem".0."value": "New"
@."menu"."popup"."menuitem".0."onclick": "CreateNewDoc()"
@."menu"."popup"."menuitem".0 <=> }
@."menu"."popup"."menuitem".1 <=> {
@."menu"."popup"."menuitem".1."value": "Open"
@."menu"."popup"."menuitem".1."onclick": "OpenDoc()"
@."menu"."popup"."menuitem".1 <=> }
@."menu"."popup"."menuitem".2 <=> {
@."menu"."popup"."menuitem".2."value": "Close"
@."menu"."popup"."menuitem".2."onclick": "CloseDoc()"
@."menu"."popup"."menuitem".2 <=> }
@."menu"."popup"."menuitem" <=> ]
@."menu"."popup" <=> }
@."menu" <=> }
@ <=> }
ãã®ä»ã®ãã¡ã€ã«ã¯ä»¥äžã®éãã§ããä»åã®æ€èšŒã§ã¯ parser éšåã¯å€æŽãã tokenizer ã®å®è£ ã®ã¿ã倿ŽããŠããŸãã
-
parsejson.shæ€èšŒã¹ã¯ãªããïŒïŒãã€ãã䜿ããªã tokenizerïŒ -
parsejson_old.shæ€èšŒã¹ã¯ãªããïŒïŒãã€ãã䜿ã tokenizerïŒ -
jsonparser.awkããŒãµãŒïŒå ±éïŒ -
jsoncallbacks.awkåºå圢åŒïŒå ±éïŒ -
example.jsonãµã³ãã« JSON -
test.jsonäžèšã®example.jsonã 10 äžåç¹°ãè¿ãããã®-
./gentest.sh ./example.json 100000 > test.jsonã§çæ
-
tokenizer ã®éãã以äžã«ç€ºããŸãã
tokenize() {
awk 'BEGIN { RS="\""; flag = 0 }
{
if (match($0, /(^|[^\\])(\\\\)*\\$/)) {
printf "%s\042", $0
next
}
if (flag) {
print "\042" $0 "\042"
} else {
gsub(/[ \r\n\t\v]/, "")
gsub(/([][{}:,]|[^][{}:,]+)/, "&\n")
printf "%s", $0
}
flag = !flag
}'
}
tokenize() {
tr -d '\r\n\t\v' | tr '"' '\n' | awk '
{
if (match($0, /(^|[^\\])(\\\\)*\\$/)) {
printf "%s\042", $0
} else {
print $0
}
}' | awk '
{
if ((NR % 2) == 0) {
print "\042" $0 "\042"
} else {
gsub(/[ \r\n\t\v]/, "")
gsub(/([][{}:,]|[^][{}:,]+)/, "&\n")
printf "%s", $0
}
}
'
}
åŠçå
容ã¯ã»ãŒåãã§ãããparsejson_old.sh ãæžããæç¹ã§ã¯ãawk ãæ¹è¡åºåãã§ã¯ãªã " åºåãã§èªã¿åããããšã«æ°ã¥ããŠããã tr ã³ãã³ãã䜿ã£ãŠååŠçããŠããã®ã«å¯Ÿã㊠parsejson.sh ã§ã¯åŠçãæ¹åã tr ãäžèŠã«ããããã« ïŒ ã€ã«åããŠãã awk ã¹ã¯ãªãããäžã€ã«ããŒãžããããšã§ãã€ãéä¿¡ããªãããŠããŸãã
èŠããã«æ€èšŒå
容ãšã¯**ãparsejson.sh ïŒãã€ãã䜿ããªã 1 ã³ãã³ãã®tokenizerïŒããšãparsejson_old.sh ïŒãã€ãã䜿ãè€æ°ã³ãã³ãã® tokenizerïŒã**ã® 2 ã€ãæ¯èŒããçµæã§ãã
time ã³ãã³ãã®åºåã®èªã¿æ¹
éåžž time ã³ãã³ããå®è¡ããå Žåã®åºåã¯ä»¥äžã®ããã«ãªããŸãããæ€èšŒã¹ã¯ãªããã§ã¯ bash ã® TIMEFORMAT 倿°ãã«ã¹ã¿ãã€ãºããããšã§èªã¿ãããã㊠CPU 䜿çšçã远å ããŠããŸããCPU 䜿çšç㯠(user + sys) / real ã§ããïŒman basn ããã%P CPU ã®ããŒã»ã³ããŒãžã(%U + %S) / %R ã§ç®åºãããŸãããïŒ
# bash ã®å Žå
$ time sleep 1
real 0m1.008s
user 0m0.001s
sys 0m0.002s
# zsh ã®å Žå
$ time sleep 1
sleep 1 0.00s user 0.00s system 0% cpu 1.008 total
# POSIX æºæ ã®å Žå
$ /usr/bin/time -p sleep 1
real 1.00
user 0.00
sys 0.00
$ cat test.json | AWK=/usr/bin/original-awk ./parsejson.sh > /dev/null
bash version: 5.0.17(1)-release
awk: /usr/bin/original-awk
tokenize awk: real 0m4.773s user 0m2.894s sys 0m0.114s cpu 63.02%
parse awk: real 0m4.786s user 0m4.241s sys 0m0.544s cpu 99.98%
---------------------------------------------------------------------------
ALL: real 0m4.787s user 0m7.135s sys 0m0.659s cpu 162.83%
è£è¶³ cat ã³ãã³ãã«ãããæéã¯ïŒzsh ã§ã®åºåããïŒ cat test.json 0.00s user 0.02s system 0% cpu 11.355 total çšåºŠãªã®ã§ååç¡èŠã§ããã¬ãã«ã§ãããŸãæ€èšŒã§ã¯å
±ã« cat ã䜿ã£ãŠããŒã¿ããã€ãã§æž¡ããŠãã®ã§ãã®éšåã§å·®ã¯çãŸããŸããã
äžèšã®åºåãã以äžã®ãããªããšãèªã¿åãããšãåºæ¥ãŸãã
- parser 㯠1 CPU ãã»ãŒ 100% 䜿ãåã£ãŠãã
- tokenizer 㯠parser ã«æ¯ã¹ãŠè² è·ãäœã
- parser ãããã«ããã¯ã«ãªã£ãŠãã tokenizer 㯠CPU 100% 䜿ãåããŠããªã
- 宿é (real) ã¯ããã 4.8 ç§ã ããå®éã« CPU ã䜿çšããŠããæé (user + sys) 㯠7.8 ç§ã§ããã
- å šäœã§ CPU ã 1.6 å䜿çšããŠãã
ã¡ãªã¿ã«æ€èšŒç°å¢ã¯ç©çãã·ã³äžã® Ubuntu 20.04 ã§ CPU 㯠Intel Core i7 3770 (3.4Ghz) ã§ 4 ã³ã¢ïŒ8 ã¹ã¬ããïŒã®ãã·ã³ã§æ€èšŒããŠããŸãã
æ€èšŒçµæããã³çµè«
A. ããã«ããã¯ã«ãããã¹ãŠã®ã³ãã³ãã 100% ã®é床ã§å®è¡ã§ããããšã¯ãŸããªã
ã1ã³ãã³ãã®tokenizerãã®çµæã¯ãã®ããã«ãªããŸãã
$ cat test.json | AWK=/usr/bin/original-awk ./parsejson.sh > /dev/null
bash version: 5.0.17(1)-release
awk: /usr/bin/original-awk
tokenize awk: real 0m4.773s user 0m2.894s sys 0m0.114s cpu 63.02%
parse awk: real 0m4.786s user 0m4.241s sys 0m0.544s cpu 99.98%
---------------------------------------------------------------------------
ALL: real 0m4.787s user 0m7.135s sys 0m0.659s cpu 162.83%
äžèšã®çµæãã tokenizer 㯠63.02% ã®é床ã§ããå®è¡ã§ããŠããŸãããparser ã®æ¹ãããŒã¿åŠçé床ãé
ã tokenizer ã«äœãããã«åŸ
ã£ãŠããæéãçºçããŠããããã§ããåŠçé床ãé
ãã³ãã³ãããããããã«ããã¯ã§ããå
¥åãšãªãããŒã¿ïŒtest.jsonïŒã¯ãã§ã«ããã®ã ããããã®ããŒã¿ã tokenizer ã¯å
šåã§åŠçããŠããŸãã®ã§ã¯ãªããïŒãšæããããããŸãããããã€ãéã®éä¿¡ã«ã¯ãã€ããããã¡ïŒLinux ã®å Žå㯠64KBïŒãååšãããã®ããã¡ã溢ããŠããŸããšãåŠçã¯ãããã¯ãããŠããŸããŸããã€ãŸã tokenizer ã¯ããŒã¿ãåŠçã parser ã«æž¡ããŸãããparser ã®åŠçãé
ãããããããã¡ãµã€ãºãè¶
ããæã§ãparser ã«ã¡ãã£ãšåŸ
ã£ãŠãšèšãã㊠tokenizer ã®åºåã¯ãããã¡ã«ç©ºããã§ãããŸã§äžæåæ¢ãããããŠããŸããŸãã
ãã仮㫠parser ã®åŠçé床ãååæ©ãã° tokenizner 㯠4.773s * 0.6302 = 3.007s ã®æéã§åŠçããããšãåºæ¥ãã§ããããtokenizer ã®åŠçã¯ãã€ãã§å ¥åããããŒã¿ãèšç®ããŠåºåããã ãã§ãã£ã¹ã¯ã¢ã¯ã»ã¹ããããã¯ãŒã¯ã¢ã¯ã»ã¹ãšèšã£ã I/O åŸ ã¡ãè¡ãåŠçããããŸããããã®ããåºåããããã¯ãããªããã° cpu ã 100% 䜿ãåãããšãå¯èœã§ããã®å Žåã® real 㯠user + sys ã®å€ãšçãããªããŸãã
ããããparser ã®æ¹ãéãããå Žåãä»åºŠã¯ tokenizer ããããŒã¿ãå±ããã« parser åŽãåŸ ã€ããšã«ãªããŸãã2 ã€ã®ããã»ã¹ã§ CPU ãå®å šã«äœ¿ãåãã«ã¯ãtokenizer ãš parser ã®åŠçæéãåãã§ãªããã°ãªããŸããããããç°ãªãåŠçãããŠããŠéœåããåãåŠçæéã«ãªãããšãªããŠãŸããããŸãããã€ãŸãåã³ãã³ãã®åŠçé床ãç°ãªãåŸ ã¡æéãçºçããã®ã§**åçŽã«ãã€ãã§ã€ãªãã§ã CPU ã䜿ãåãããšã¯åºæ¥ãŸããã**ã¡ãªã¿ã«ããäžã€å°ããªåŠçãããã³ãã³ãã远å ããŠã空ããŠãã CPU ãæå¹æŽ»çšãããã¯ããŸããããã€ãã§ã€ãªãã§ãã以äžããŒã¿ãå±ããªãéãåŸ ã€ããšããã§ããªãã®ã§ãããã
ããäžã€ã®æ€èšŒã¹ã¯ãªããã§ãããè€æ°ã³ãã³ãã® tokenizerãã®çµæã¯ãã®ããã«ãªããŸãã
$ cat test.json | AWK=/usr/bin/original-awk ./parsejson_old.sh > /dev/null
bash version: 5.0.17(1)-release
awk: /usr/bin/original-awk
tokenize tr : real 0m4.795s user 0m0.065s sys 0m0.058s cpu 2.57%
tokenize tr : real 0m4.809s user 0m0.046s sys 0m0.116s cpu 3.37%
tokenize awk: real 0m4.824s user 0m1.674s sys 0m0.032s cpu 35.36%
tokenize awk: real 0m4.837s user 0m2.878s sys 0m0.033s cpu 60.18%
parse awk: real 0m4.852s user 0m4.311s sys 0m0.536s cpu 99.91%
---------------------------------------------------------------------------
ALL: real 0m4.853s user 0m8.977s sys 0m0.778s cpu 201.01%
ããã«ããã¯ã¯ parser ã«ããã®ã§ãããããã®ã³ãã³ãã§åŸ ã¡æéãçºçããŠãããšããããšãããããŸãããŸãåŠçã軜ãã³ãã³ãã»ã©äŒãã§ããæéãå€ãïŒCPU 䜿çšçãå°ãªãïŒããšãããããŸãã
ãã®çµæããèšããããšã¯**ãããã«ããã¯ãšãªã£ãŠãã³ãã³ããåå²ããªãéã宿éã¯çããªããªãã**ãšããããšã§ããããããªããããã«ããã¯ãšãªã£ãŠã parser ã¯ãã®åŠçå 容ããåå²ããããšã¯é£ããã§ãã
B. ããã«ããã¯ã§ãªãç®æãè€æ°ã³ãã³ãã«ããŠãã€ãã§ã€ãªãããšå®æéãCPUæéãé ããªã
å çšã®çµæã®åæ²ã§ãã
$ cat test.json | AWK=/usr/bin/original-awk ./parsejson.sh > /dev/null
bash version: 5.0.17(1)-release
awk: /usr/bin/original-awk
tokenize awk: real 0m4.773s user 0m2.894s sys 0m0.114s cpu 63.02%
parse awk: real 0m4.786s user 0m4.241s sys 0m0.544s cpu 99.98%
---------------------------------------------------------------------------
ALL: real 0m4.787s user 0m7.135s sys 0m0.659s cpu 162.83%
$ cat test.json | AWK=/usr/bin/original-awk ./parsejson_old.sh > /dev/null
bash version: 5.0.17(1)-release
awk: /usr/bin/original-awk
tokenize tr : real 0m4.795s user 0m0.065s sys 0m0.058s cpu 2.57%
tokenize tr : real 0m4.809s user 0m0.046s sys 0m0.116s cpu 3.37%
tokenize awk: real 0m4.824s user 0m1.674s sys 0m0.032s cpu 35.36%
tokenize awk: real 0m4.837s user 0m2.878s sys 0m0.033s cpu 60.18%
parse awk: real 0m4.852s user 0m4.311s sys 0m0.536s cpu 99.91%
---------------------------------------------------------------------------
ALL: real 0m4.853s user 0m8.977s sys 0m0.778s cpu 201.01%
è€æ°ã®ã³ãã³ãããã€ãã§ã€ãªãã ã»ãããrealãuserãsys ã®å šãŠãé ããªã£ãŠããããšãããããŸããããããªå·®ã§ããããäœåãå®è¡ãããšèª€å·®ã§é転ããããšãæãã®ã§ããåºæ¬çãªåŸåãšããŠã¯ãã®ããã«ãªããŸãã
ãŸããè€æ°ã³ãã³ãã®tokenizerãã®æ¹ã user ãš sys ãå¢ããŠããçç±ã¯ç°¡åã§ããäžã€ã®ã³ãã³ãã§è¡ã£ãŠããåŠçããè€æ°ã®ã³ãã³ãã«åãããšããããšã¯ããã®åãã€ãééä¿¡ãè¡ãããããã§ãããã€ãééä¿¡ã¯ã·ã¹ãã ã³ãŒã«ã§ãã®ã§ãã®åŒã³åºãã§ sys ãå¢ããŸãããŸããã€ãã§æž¡ã£ãŠããïŒããã 24 MBã®ïŒããŒã¿ãããããã®ã³ãã³ããåŠçããŸãã®ã§ãåœç¶ user ãå¢ããŠããŸããŸããããã¯**ãåŠçãè€æ°ã®ã³ãã³ãã«åãããšåã³ãã³ãã®ããŒã¿åŠçãšãã€ãééä¿¡ã®ãªãŒããŒãããã§é ããªãã**ãšããåçŽãªè©±ã§ãããããŸããã
åé¡ã¯ real ãé ããªã£ãŠããç¹ã§ãããã®çç±ã¯ CPU ã 4 ã³ã¢ã§ãããšããããšã§ãããã€ããŒã¹ã¬ããã£ã³ã°ããããã 8 ã³ã¢çžåœã«èŠããŠããŸãããããã¯æ¬äŒŒçãªãã®ã§å®éã®ç©çç㪠CPU ã³ã¢æ°ã¯ 4 ã³ã¢ã§ãããè€æ°ã³ãã³ãã®tokenizerãã¯å šéšã§ 5 ããã»ã¹ãèµ·åããŠãããã 4 ã³ã¢ãè¶ ããŸãããã®ããäœã£ã 1 ããã»ã¹åã parser ãå®è¡ããŠãã³ã¢ã«æº¢ããŠããŠçµæãparser ãé ããªã£ãŠãããšèããŠããŸãããã®ãã 6 ã³ã¢ãããããå€ãã®CPU ã³ã¢ãæèŒããã·ã¹ãã ã§ããã°å®æéãé·ããªãããšã¯ãªãã£ãã§ãããããããããããã€ãã§ã€ãªãã ã³ãã³ãã®æ°æ¬¡ç¬¬ã§ããã³ãã³ãã 10 åã 20 åããã€ãã§ã€ãªãã§ããã°åœç¶ããããè¶ ãã CPU ã³ã¢ãå¿ èŠã«ãªãã®ã¯èšããŸã§ããããŸããããå°ãªãã³ã¢ã®ã·ã¹ãã ã§ããã°å®æéã¯æŽã«é ããªããŸãã
C. 倿°ã®ã³ãã³ãããã€ãã§ã€ãªããšãCPUã䜿ãåãããã«ãCPUãç¡é§ã«äœ¿ã朰ãã
A. ã§ç§ã¯ãåŸ ã¡æéãããããåçŽã«ãã€ãã§ã€ãªãã§ã CPU ã䜿ãåãããšã¯åºæ¥ãŸããããšæžããŸãããæ¹ããŠãã®çµæãèŠãŠã¿ãŸãããã
$ cat test.json | AWK=/usr/bin/original-awk ./parsejson.sh > /dev/null
ïž
---------------------------------------------------------------------------
ALL: real 0m4.787s user 0m7.135s sys 0m0.659s cpu 162.83%
$ cat test.json | AWK=/usr/bin/original-awk ./parsejson_old.sh > /dev/null
ïž
---------------------------------------------------------------------------
ALL: real 0m4.853s user 0m8.977s sys 0m0.778s cpu 201.01%
ããïŒãã€ãã䜿ããªãå Žå㯠CPU ã 1.6 ã³ã¢ ïŒ162.83%) ãã䜿ããŠããŸããããè€æ°ã®ã³ãã³ãããã€ãã§ç¹ãã ã 2 ã³ã¢ïŒ201.01%) 䜿ããŠãŸããïŒããã£ãããŒãã³ãã³ãããã€ãã§ã€ãªãã æ¹ã CPU ã䜿ãåããŠãããŒïŒãã»ã»ã»ãšããããšã«ã¯ãªããŸããããåŠçããŠãããŒã¿éã¯åãã§å®æéãæ®ã©å€ãããªãã®ã« CPU ãå€ã䜿ã£ãŠãã®ã§ããã°ãããã¯**ãCPU ã䜿ãåãïŒïŒå¹çãã䜿ã£ãŠããïŒãã®ã§ã¯ãªããCPU ãç¡é§ã«äœ¿ã朰ããŠãã**ã ãã§ããæ¬æ¥ä»ã®çšéã§äœ¿ããã¯ãã® CPU ãããŒã¿åŠçãšãã€ãééä¿¡ã§ç¡é§ã«å€±ã£ãŠããŸããåãä»äºéã§ããã°ãå°ãªãåŽåïŒCPU 䜿çšçïŒã§åŠçã§ããæ¹ãè² è·ã軜ããšããã®ã¯èšããŸã§ããããŸããã
CPU 䜿çšçãå€ãçç±ãèããã«ééã£ãçè§£ãããŠããšãCPU 䜿çšçãå€ã ïŒ äœã£ãŠã CPU 䜿ãåã£ãŠããã倿°ã®ã³ãã³ãããã€ãã§ã€ãªãã®ã¯çŽ æŽãããææ³ã ããªããŠééã£ãçµæã«ãªããŸããCPU ã䜿ãåãã®ã«å¿ èŠãªã®ã¯ CPU ãäŒãŸããã«åãããããšã§ãããç¡é§ãªä»äºãå¢ãããŠäŒã¿ãªãåãããã£ãŠçç£æ§ã¯äžãããªãã§ãããïŒçç£æ§ãäžããã®ã«å¿ èŠãªã®ã¯ãç¡é§ãªä»äºãå¢ããããšã§ã¯ãªãæã空ããŠäŒãã§ãã人ãããªãããã«ä»äºãåçã«å²ãæ¯ãããšã§ãã
D. ããã«ããã¯ãšãªã£ãŠããéšåãã©ãã§ãããæå®ã§ããªã
ããªã«èšã£ãŠãã®ïŒ parser éšåãããã«ããã¯ã«ãªã£ãŠããšãã話ãããŠããããïŒã
ã¯ããããã§ãããnawk (original-awk) ã®å Žå㯠parser éšåãããã«ããã¯ã«ãªã£ãŠããŸãããå®ã¯ãã®è©±ãä»å JSON ããŒãµãŒã®éçºã®è©±ããã¿ã«ãã€ã䞊ååŠçãèšäºãæžãããšã«ããäžçªã®çç±ã§ãã
ããã¯ã·ã§ã«ã¹ã¯ãªããã«ããéçºã®é£ããæã§ sed ã awK ãšèšã£ãå€éšã®ã³ãã³ãã«äŸåããŠããã®ã§ç°å¢ã«ãã£ãŠç°ãªãå®è£
ã䜿ãäºããããšããããšã§ãã䜿çšããã³ãã³ãã®å®è£
ãå€ããã°ããã«ããã¯ã«ãªãéšåãå€ãã£ãŠããŸãå¯èœæ§ããããŸããçè«äžã¯ãããªãã¯ãã§ããããããå®çŸããè¯ãäŸãæããŠããŸããã§ããããããä»åã® JSON ããŒãµãŒã¯éè¯ãå®çŸããŠãããŸããã
UNIX ã macOS ã FreeBSD ãªã©ã® nawk ã䜿ãããŠããç°å¢ã§ããã°ããããŸã§ã®è©±ã®ããã« parser ãããã«ããã¯ã«ãªã£ãŠããŸããããLinux ã®å Žå Debian ç³»ã§ã¯ mawkãRedHat ç³»ã§ã¯ gawk ã䜿ãããŠããŸããããããã®çµæãèŠãŠã¿ãŸãããã
$ cat test.json | AWK=/usr/bin/original-awk ./parsejson.sh > /dev/null
bash version: 5.0.17(1)-release
awk: /usr/bin/original-awk
tokenize awk: real 0m4.773s user 0m2.894s sys 0m0.114s cpu 63.02%
parse awk: real 0m4.786s user 0m4.241s sys 0m0.544s cpu 99.98%
---------------------------------------------------------------------------
ALL: real 0m4.787s user 0m7.135s sys 0m0.659s cpu 162.83%
$ cat test.json | AWK=/usr/bin/mawk ./parsejson.sh > /dev/null
bash version: 5.0.17(1)-release
awk: /usr/bin/mawk
tokenize awk: real 0m2.376s user 0m2.364s sys 0m0.012s cpu 100.00%
parse awk: real 0m2.376s user 0m1.410s sys 0m0.033s cpu 60.73%
---------------------------------------------------------------------------
ALL: real 0m2.377s user 0m3.776s sys 0m0.045s cpu 160.72%
$ cat test.json | AWK=/usr/bin/gawk ./parsejson.sh > /dev/null
bash version: 5.0.17(1)-release
awk: /usr/bin/gawk
tokenize awk: real 0m6.407s user 0m6.395s sys 0m0.012s cpu 100.00%
parse awk: real 0m6.408s user 0m3.037s sys 0m0.033s cpu 47.91%
---------------------------------------------------------------------------
ALL: real 0m6.409s user 0m9.434s sys 0m0.046s cpu 147.91%
ãããŸã§ã®è©±ã¯ãããã«ããã¯ã«ãªã£ãŠãã parser ãè€æ°ã®ã³ãã³ãã«åå²ããªããã°ã宿é (real) ã¯æ¹åããªããšãããªããšãã話ã§ããããmawk ã gawk ã§ã¯éã§ tokenizer ã®æ¹ãè€æ°ã®ã³ãã³ãã«åå²ããªããã°ãããŸãããé©åã§ãªãæ¹ãè€æ°ã®ã³ãã³ãã«åå²ããŠã宿éãçããªãããšã¯ãªãããã CPU æéãå¢ããŠããŸãã ãã§ãã¡ãªãããããããŸãããã€ãŸã䜿çšããç°å¢ãã³ãã³ãã®å®è£ ãéå®ããªããã°ãã€ãã©ã€ã³äžŠååã§å¹çãã CPU ã䜿ãããšã¯ã§ããŸããã
ããã¯ã·ã§ã«ã¹ã¯ãªããã ãã§ã¯ãªãä»ã®ããã°ã©ãã³ã°èšèªã§ãã«ãŒãã«ãèšèªã䜿çšããŠããã©ã€ãã©ãªã®ããŒãžã§ã³ãå€ãã£ãæã«ããã«ããã¯ã«ãªãéšåãå€ãããšèšãç¹ã§ã¯åããªã®ã§ãããä»ã®èšèªã§ã¯å šãç°ãªãå®è£ ã䜿ãããšã¯å°ãªãã®ã§ããããã倧ããå€ããããšãªããŠãããŸããããããã·ã§ã«ã¹ã¯ãªããã§ã¯å€éšã®äŸåé¢ä¿ãå€ããªããã¡ã§ç°å¢ã«ãã£ãŠå€ããéšåãå€ãã®ã§ãå¥ã® OS ã«å€æŽããããããšç°¡åã«ç¹æ§ãå€ãã£ãŠããŸããŸãã
ãã®èšäºã®è©±ãšçŽæ¥é¢ä¿ãããŸããããéåžžã«éèŠãªããšã¯ mawk ããšãŠãéããšããããšã§ããã€ãŸã awk ã䜿ãã·ã§ã«ã¹ã¯ãªããã®ããã©ãŒãã³ã¹ãæ°ã«ããã®ã§ããã° mawk ãã€ã³ã¹ããŒã«ããç°å¢ãæ§ç¯ããæ¹ãè¯ããšããããšã§ããã©ã® awk ã®å®è£ ã§ãåãããã« POSIX ã«æºæ ãç§»æ€æ§ãéèŠããã®ã¯è¯ãèãã ãšæããŸãããããã©ãŒãã³ã¹ãéèŠã«ãªãã·ã¹ãã ã§ããã°ãçµå± mawk ãã€ã³ã¹ããŒã«ããŠäœ¿ãã¹ããšããçµè«ã«ãªãã§ããããmawk èªäœããªãŒãã³ãœãŒã¹ã§ç§»æ€æ§ãæãéã mawk ã«äŸåããŠãã©ã®ç°å¢ã§ãåãããã«åããœãããŠã§ã¢ã¯äœããŸããããã¯ãªãŒãã³ãœãŒã¹ã§ãã GNU ã®ã³ãã³ãã»ããã«ãåœãŠã¯ãŸããŸãããããã**ã€ã³ã¹ããŒã«ããã°ããã ããªã®ã§ãé«ãç§»æ€æ§ãå®çŸããããã« POSIX ã§èŠå®ãããã³ãã³ããšãªãã·ã§ã³ã ãã䜿ã£ãŠéçºããå¿ èŠã¯ãããŸããã**POSIX ã§èŠå®ãããã³ãã³ããšãªãã·ã§ã³ã ãã䜿ããªããã°äºææ§ã»ç§»æ€æ§ã確ä¿ã§ããªããšããç¶æ³ã¯ãèªç±ã«ãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ããããšãã§ããªãç°å¢ã«éã£ã話ã§ãã
E. ããã«ããã¯ãšãªã£ãŠããéšåãæ¹åãããšå®æéã¯çããªãã CPU æéã¯ãã£ã±ãå¢ãã
ããŠãmawk ãš gawk ã§ã¯ tokenizer ãããã«ããã¯ã«ãªã£ãŠããŸãã®ã§ããã¡ããè€æ°ã®ã³ãã³ãã«åå²ããããšã¯å®æéãçãããæ¹åã«ãªããŸãããšããããšã§ãã£ãŠã¿ãŸãããã
$ cat test.json | AWK=/usr/bin/mawk ./parsejson.sh > /dev/null
bash version: 5.0.17(1)-release
awk: /usr/bin/mawk
tokenize awk: real 0m2.376s user 0m2.364s sys 0m0.012s cpu 100.00%
parse awk: real 0m2.376s user 0m1.410s sys 0m0.033s cpu 60.73%
---------------------------------------------------------------------------
ALL: real 0m2.377s user 0m3.776s sys 0m0.045s cpu 160.72%
$ cat test.json | AWK=/usr/bin/mawk ./parsejson_old.sh > /dev/null
bash version: 5.0.17(1)-release
awk: /usr/bin/mawk
tokenize tr : real 0m1.677s user 0m0.072s sys 0m0.011s cpu 4.99%
tokenize tr : real 0m1.682s user 0m0.028s sys 0m0.065s cpu 5.52%
tokenize awk: real 0m1.686s user 0m0.972s sys 0m0.023s cpu 59.03%
tokenize awk: real 0m1.690s user 0m1.673s sys 0m0.016s cpu 99.89%
parse awk: real 0m1.692s user 0m1.421s sys 0m0.004s cpu 84.23%
---------------------------------------------------------------------------
ALL: real 0m1.693s user 0m4.168s sys 0m0.122s cpu 253.44%
mawk ã§ã¯äœã£ãŠãã CPU ãæŽ»çšããããšã§ 1.4 åéããªããŸãããããã CPU æé㯠1.16 åã«å¢ããŠããŸãã
$ cat test.json | AWK=/usr/bin/gawk ./parsejson.sh > /dev/null
bash version: 5.0.17(1)-release
awk: /usr/bin/gawk
tokenize awk: real 0m6.407s user 0m6.395s sys 0m0.012s cpu 100.00%
parse awk: real 0m6.408s user 0m3.037s sys 0m0.033s cpu 47.91%
---------------------------------------------------------------------------
ALL: real 0m6.409s user 0m9.434s sys 0m0.046s cpu 147.91%
$ cat test.json | AWK=/usr/bin/gawk ./parsejson_old.sh > /dev/null
bash version: 5.0.17(1)-release
awk: /usr/bin/gawk
tokenize tr : real 0m5.108s user 0m0.088s sys 0m0.044s cpu 2.57%
tokenize tr : real 0m5.123s user 0m0.021s sys 0m0.041s cpu 1.21%
tokenize awk: real 0m5.139s user 0m2.152s sys 0m0.053s cpu 42.90%
tokenize awk: real 0m5.153s user 0m5.132s sys 0m0.020s cpu 99.99%
parse awk: real 0m5.154s user 0m2.954s sys 0m0.039s cpu 58.07%
---------------------------------------------------------------------------
ALL: real 0m5.155s user 0m10.351s sys 0m0.197s cpu 204.66%
gawk ã§ã¯äœã£ãŠãã CPU ãæŽ»çšããããšã§ 1.24 åéããªããŸãããããã CPU æé㯠1.11 åã«å¢ããŠããŸãã
CPU æéã¯å¢ããŠããŸãã宿éãçããªã£ãŠããã®ã§ãäžè¬çã«èããã°ãããã¯äž¡æ¹ãšãæ¹åãããŠãããšèšããã§ãããããã ã CPU ãäœã£ãŠããã°ã®è©±ã§ããCPU ãäœã£ãŠããªãç¶æ³ã§ã¯äž¡æ¹ãšã宿éã¯éã«é·ããªããŸãïŒF.ã«ç¶ãïŒã
F. ããã«ããã¯ã®æ¹åã§å®æéã¯çããªããäŒãã§ãã CPU ããªããã°éã«é·ããªã
以äžã® multi.sh ã¯åãã¹ã¯ãªããã䞊åã§ 10 åå®è¡ããŸããããã«ããäŒãã§ãã CPU ããªãããŠããŸãããšãã話ã§ããå®éã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ xargs -P ãããã¯ã°ã©ãŠã³ãã䜿ã£ã䞊ååããŠã§ãã·ã¹ãã ïŒCGIïŒã®ããã«åæã¢ã¯ã»ã¹ãçºçããŠãã¢ã¯ã»ã¹æ¯ã«ã³ãã³ããèµ·åãããããªç¶æ³ã«çžåœããŸãã
# mawk ã®å Žå
$ AWK=/usr/bin/mawk time -p ./multi.sh ./parsejson.sh
real 9.07
user 70.37
sys 0.95
$ AWK=/usr/bin/mawk time -p ./multi.sh ./parsejson_old.sh
real 9.36
user 72.36
sys 2.02
# gwak ã®å Žå
$ AWK=/usr/bin/gawk time -p ./multi.sh ./parsejson.sh
real 23.00
user 181.58
sys 1.57
$ AWK=/usr/bin/gawk time -p ./multi.sh ./parsejson_old.sh
real 24.33
user 191.26
sys 2.41
mawk ãš gawk ã§ã¯ parsejson_old.sh ã®æ¹ã real ã¯çãã£ãã¯ãã§ããäžèšã®äŸã§ã¯éã«ãªã£ãŠããŸããã€ãŸã CPU ãäœã£ãŠããŠããã®äœã£ãŠãã CPU ã«åŠçãæ¯ãåããããŠãããã real ãçããªã£ãã®ã§ãã£ãŠãCPU ãäœã£ãŠãªãç¶æ³äžã§ã¯ããã®ããã«ãã€ãééä¿¡ã«ãããªãŒããŒãããã§ real ãŸã§ããæªããªã£ãŠããŸããŸãã
G. è€æ°ããã»ã¹ã§äžŠååŠçãããªãã°ãã€ãã©ã€ã³äžŠååã«ãã ããæå³ããªã
A.ã§ããã«ããã¯ã«ãã£ãŠãã€ãã§ã³ãã³ããã€ãªãã ã ãã§ã¯ CPU ã䜿ãåããããšã¯ãªããšæžããŸãããã§ã¯ CPU ã䜿ãåãã«ã¯ã©ãããã°ãããïŒã§ãããF.ã§ãã£ãããã«ããã»ã¹ïŒã³ãã³ãïŒãè€æ°èµ·åããããã»ã¹åäœã®äžŠååŠçã䜿ãããšã§ãã
ãã€ãã©ã€ã³äžŠååã®æ¬ ç¹ã¯ãã¹ã¯ãªãããä¿®æ£ããããšãªãäžŠåæ°ã倿Žããããšãäºå®äžäžå¯èœã§ãããšããããšã§ããCPU ã³ã¢ãå€ãã·ã¹ãã ã ãã CPU ã 32 ã³ã¢äœ¿ãããã«ããããšæã£ãŠãããã€ãã§ã€ãªãã³ãã³ããšããåŠçå 容ãå€ããªãããšã«ã¯äžå¯èœã§ãããã®ããã·ã¹ãã ãæã£ãŠãã CPU ãå¹çãã䜿ãåãããšæã£ãããã³ãã³ããè€æ°èµ·åãããããããŸããã
ãããŠã³ãã³ããè€æ°èµ·åããã®ã§ããã°ãã€ãã©ã€ã³äžŠååãè¡ãæå³ãã»ãšãã©ãªããªããŸããããã«ããã¯ãæ¢ããŠåŠçãè€æ°ã®ã³ãã³ãã«åæ£ãããããããããäžã€è¿œå ã§ã³ãã³ããèµ·åããã»ããå§åçã«ç°¡åã ããã§ãããããªããšã«ãã€ãã¯åã«ãªãŒããŒããããå¢ãããŠããŸãã ãã§ãããªãã®ã§ããã€ãã§ã€ãªãã³ãã³ãã®æ°ã¯å°ãªãæ¹ãå¹ççã« CPU ã䜿ãåãããšãã§ãããšããããšã«ãªããŸãã
H. 䞊åå®è¡ã劚ããã³ãã³ãããã
ãã€ãã©ã€ã³ã§ã€ãªãã ã³ãã³ãã¯åæã«èµ·åããŸãããåæã«ããŒã¿ãåŠçããŠãããšã¯éããŸãããããã³ãã³ãã¯åã®ã³ãã³ãããããŒã¿ãå°çãããŸã§ã¯äœãããäŒãã§ããŸãã
ãããŠã³ãã³ãã«ãã£ãŠã¯ããŒã¿ããã¹ãŠèªã¿èŸŒããŸã§ã¯ã次ã®ã³ãã³ãã«ããŒã¿ãæž¡ããªãã³ãã³ãããããŸãããã®å
žåçãªãã®ã sort ã³ãã³ãã§ãã以äžã®ãããªã³ãŒããå®è¡ãããšããã確ãããããšãã§ããŸãã
ãŸã sort ã³ãã³ãããªãå Žåã¯ããã®ããã«ãã€ãã§ã€ãªãã ã³ãã³ãïŒã³ãŒãïŒã®å·Šå³ã䞊åã§å®è¡ãããŠããããšãããããŸãã
$ for i in $(seq 5); do date +%s; sleep 1; done \
| while read t; do date +"çææé:$t å°çæé:%s"; done
çææé:1639483922 å°çæé:1639483922
çææé:1639483923 å°çæé:1639483923
çææé:1639483924 å°çæé:1639483924
çææé:1639483925 å°çæé:1639483925
çææé:1639483926 å°çæé:1639483926
# ããŒã¿ã®çæãšåæã«æ¬¡ã®ã³ãã³ãã䞊åã§åäœããŠãããã
# ãçææéããšãå°çæéããåã
ããããéã« sort ã³ãã³ããå
¥ãããšããã¹ãŠã®ããŒã¿ã®çæãçµãã£ãŠãããããŸãšããŠããŒã¿ãç»é¢ã«åºåããŸãã
$ for i in $(seq 5); do date +%s; sleep 1; done \
| sort | while read t; do date +"çææé:$t å°çæé:%s"; done
çææé:1639483972 å°çæé:1639483977
çææé:1639483973 å°çæé:1639483977
çææé:1639483974 å°çæé:1639483977
çææé:1639483975 å°çæé:1639483977
çææé:1639483976 å°çæé:1639483977
# ãã¹ãŠã®ããŒã¿ã®çæãåŸ
ã£ãŠããæ¬¡ã®ã³ãã³ããå®è¡ãããã
# ãå°çæéãããã¹ãŠãçææéãã®åŸã§åãæéã«ãªã£ãŠãã
ã€ãŸãããã®å Žåãã€ãã©ã€ã³ã§ã€ãªãã ã³ãã³ãã¯å
šã䞊ååŠçãããŠããŸããããã®çç±ã¯ sort ã³ãã³ããäœããã£ãŠãããïŒãèãããšããããšæããŸããããŒã¿ã®ãœãŒãã«ã¯å
šãŠã®ããŒã¿ãåãåãå¿
èŠãããã®ã§ãå
šãŠã®ããŒã¿ã®å
¥åãå®äºãããŸã§ã¯å
šãåºåãããªãã®ã§ãã**ã³ãã³ãããã€ãã§ã€ãªãã ãããšãã£ãŠå¿
ããã䞊åã§åäœããããã§ã¯ãããŸããã**ãã®ããã«åºåããããã¯ãããŠããŸãã³ãã³ããéã«å
¥ããŠããŸããšããã®ååŸã§äžŠååã®å¹æãç¡ããªã£ãŠããŸããŸããïŒæ³šæ 䞊ååäœãããªãã®ã¯ãããã¯ããã³ãã³ãã®ååŸã§ãããããã¯ããã³ãã³ãã®åããããã¯åŸã«ãè€æ°ã®ã³ãã³ãããããå Žåã¯ãè€æ°ã®ã³ãã³ããã®äžã¯äžŠååäœãè¡ããŸããã€ãŸããããã¯ããã³ãã³ãã§åå²ã㊠2 ã€ã®ãã€ãã©ã€ã³ãå®è¡ãããããªåœ¢ã®åäœã§ããïŒ
åæ§ã®ã³ãã³ãã«ã¯ xargs ã³ãã³ãããããŸãããã®ã³ãã³ãããæšæºå
¥åã§åãåã£ãããŒã¿ãèããŠãããŸãšããŠå®è¡ãããã®ãªã®ã§ xargs ã³ãã³ãã®åãšãxargs ã§åŒã³åºãã³ãã³ãã¯äžŠååäœããŸããã
$ for i in $(seq 5); do date +%s; sleep 1; done
| xargs sh -c 'for t; do date +"çææé:$t å°çæé:%s"; done' --
çææé:1639481260 å°çæé:1639481265
çææé:1639481261 å°çæé:1639481265
çææé:1639481262 å°çæé:1639481265
çææé:1639481263 å°çæé:1639481265
çææé:1639481264 å°çæé:1639481265
# ããŒã¿ãå
šãŠçæããŠããããŸãšããŠã³ãã³ããåŒã³åºããã
# ãå°çæéãããã¹ãŠãçææéãã®åŸã§åãæéã«ãªã£ãŠãã
ãã ã -n 1 ãæå®ããå Žåã¯äžŠåã§åäœããŸãã
$ for i in $(seq 5); do date +%s; sleep 1; done \
| xargs -n 1 sh -c 'for t; do date +"çææé:$t å°çæé:%s"; done' --
çææé:1639481294 å°çæé:1639481294
çææé:1639481295 å°çæé:1639481295
çææé:1639481296 å°çæé:1639481296
çææé:1639481297 å°çæé:1639481297
çææé:1639481298 å°çæé:1639481298
# ããŒã¿ãçæãããã³ã«ã³ãã³ããå®è¡ããŠãããã
# ãçææéããšãå°çæéããåã
ãã€ãã䜿ããšäžŠåã§åäœãããšããæã蟌ã¿ãããxargs ã䜿ã£ãŠéããªãã®ã䞊ååäœããŠããããã ãšåéãããã¡ã§ãããå®ã¯ xargs ã¯äžŠååäœã劚ããã³ãã³ãã§ãããå€éšã³ãã³ããèµ·åããã®ã¯é
ãããšãã話ãæãåºããŠãã ãããxargs ãéããªãçç±ã¯äžŠååŠçãšã¯ç¡é¢ä¿ã§ãå€éšã³ãã³ãã®åŒã³åºãåæ°ãæžãããã®ãé«éåããçç±ã§ãããŸã -n 1 ãæå®ããŠäžã€ãã€ã³ãã³ããå®è¡ããããšäžŠååäœãè¡ããŸããã代ããã«ããŒã¿ã®æ°ã ãå€éšã³ãã³ããåŒã³åºãããšã«ãªãããããã©ãŒãã³ã¹ãäœäžããŸããå¿
ããã䞊ååäœã®æ¹ãè¯ããšã¯éããå€éšã³ãã³ãã®èµ·åã³ã¹ããã©ãã ã倧ãããããããäŸã§ãã
I. ããŒã¿ãçµã蟌ãã³ãã³ãã¯ãã€ãã©ã€ã³ã®å§ãã®æ¹ã«çœ®ããæ¹ãè¯ã
ããããããã¯èª°ããçŽæã§ãããããšã ãšæããŸããã
cat data.txt | sed 's/a/A/g' | grep 00cat data.txt | grep 00 | sed 's/a/A/g'
ã¯ã©ã¡ããåãçµæãè¿ããŸãããåŸè ã®ã»ããéãã§ãã
$ time cat data.txt | sed 's/a/A/g' | grep 00 > /dev/null
bb64b259dce518c796bdcf8b8f94642e -
real 0m0.496s user 0m0.480s sys 0m0.108s cpu 118.55%
$ time cat data.txt | grep 00 | sed 's/a/A/g' > /dev/null
real 0m0.089s user 0m0.083s sys 0m0.044s cpu 141.35%
çç±ã¯æããã§ããããå€ãã®ããŒã¿ã sed ããŠããå¿
èŠãªããŒã¿ãçµã蟌ãããããå
ã«å¿
èŠãªããŒã¿ãçµã蟌ãã§ãã sed ããæ¹ã sed ãåŠçããããŒã¿éãæžãããã§ãã
äœè«ã§ããå®ã¯ããã¯ç§ãæ°ãã JSON ããŒãµãŒãæžããŠããçç±ã®äžã€ã§ããããŸããã³ãã³ãã©ã€ã³ã§äœ¿ãã JSON ããŒãµãŒã« gron ãšããã³ãã³ãããããŸãããMake JSON greppable!ããšæžããŠããããšããããããããã«ããã®ã³ãã³ã㯠JSON ããŒã¿ã grep ãããã圢åŒã«å€æããŸãã
â¶ gron testdata/two.json | grep likes | grep -v cheese
json.likes = [];
json.likes[0] = "code";
json.likes[2] = "meat";
ãã®ã³ãã³ãã®åé¡ç¹ã¯ãJSON ããŒã¿ã®éãå€ããªã£ãæãgrep ããéãå€ããªã£ãŠããŸããšããæã§ããããŒã¿ã¯å°ãªãæ¹ãéãã®ã§ãçµã蟌ãã³ãã³ãã¯å ã«å®è¡ãã¹ãã§ãããJSON ããŒã¿ã¯ãã®ãŸãŸã§ã¯ grep ã§ããŸãããå ã« gron ã§ grep å¯èœãªããŒã¿ã«å€æãããããããŸãããããããããšå šãŠã®ããŒã¿ããã€ãééä¿¡ã§ grep ã«æž¡ããã°ãªããã»ã»ã»ã©ã¡ããå ããšããé¶åµåé¡ã«ãªã£ãŠããŸããŸãã
ãã®åé¡ã®æ ¹æ¬çãªåå ã¯ãJSON ããŒã¿ã®ããŒã¹ãšçµã蟌ã¿ãå¥ã ã®ã³ãã³ãã«åããŠããŸã£ãããšã«ãããŸããç§ãéçºããŠããæ°ãã JSON ããŒãµãŒã§ã¯ãã®äºã€ãåæã«è¡ããŸããã€ãŸãããŒã¹ããªããå¿ èŠãªãã®ã ããå å·¥ããªããããŒã¿ãåºåãããšããä»çµã¿ã§ãããã㯠awk ãšåãèãæ¹ã§ãawk ãæ£èŠè¡šçŸã«ãããããæååã«å¯ŸããŠå å·¥ããªããããŒã¿ãåºåããŸãã
䜿ãæ
£ãã grep ã䜿ããã®ã¯äŸ¿å©ãããããŸããã JSON ã®å Žåã¯æå®ããããŒã§æœåºãããã®ã§ãå人çã«ã¯ grep ã§çµã蟌ã¿ãããšã¯æããªããã§ããããããã«ãçµã蟌ãã åŸãã©ããã£ãŠå€ãåãåºãã®ïŒããšããåé¡ã¯è§£æ±ºããŠãªãã®ã§ãJSON ãããŒã¹ãã gron ã®åºåçµæãããã«ããŒã¹ããªããã°ãªããäºéã®ããŒã¹ãå¿
èŠã«ãªããŸãã
è©±ãæ»ããšãäžè¬çã«çµã蟌ã¿ãè¡ãã³ãã³ãã¯åãã®æ¹ã«çœ®ããæ¹ãè¯ãã®ã§ãããå®ã¯äžã®èšæž¬çµæã«ã¯çŽåŸã§ããªããšããããã£ãŠãããã¯å
ã«ããŒã¿ãçµã蟌ãã æ¹ããåŸãã®ã³ãã³ãã¯æã«ãªã£ãŠäŒãã§ããæéãå€ããªã = CPU 䜿çšçã¯æžããšäºæž¬ããŠããã®ã§ãããããã¯ãªã£ãŠããŸãããã©ãããã㯠sed ãš greïœ ã®é床差ãããããã®ã®ããã§ãã
grep ã®ä»£ããã« sed ã䜿ã£ãŠçµã蟌ã¿ãè¡ã£ãå Žåã¯ãå ã«çµã蟌ã¿ãè¡ã£ãã»ãã CPU 䜿çšçã¯æžããŸããã
$ time cat data.txt | sed 's/a/A/g' | sed -n '/00/p' > /dev/null
real 0m0.466s user 0m0.552s sys 0m0.159s cpu 152.56%
$ time cat data.txt | sed -n '/00/p' | sed 's/a/A/g' > /dev/null
real 0m0.180s user 0m0.164s sys 0m0.079s cpu 135.09%
ã³ãã³ãã®éãããããé床差ãã·ã§ã«ã¹ã¯ãªããã§ CPU ãå¹çè¯ã䜿ãããšã¯ãšãŠãé£ããã§ãã
ãŸãšã ãã€ãã©ã€ã³äžŠååã§ CPU ã®æå€§å¹çãåŒãåºãã®ã¯é£ãã
ãã€ãã©ã€ã³äžŠååã¯ã³ãã³ãããã€ãã§ã€ãªããã ãã§ãç°¡åã«äœ¿ãã䞊ååææ³ã§ããããããªãŒããŒããããããæ®éã«ã€ãªããã ãã§ã¯ CPU ã®æå€§æ§èœãåŒãåºãããšã¯åºæ¥ãŸãããã³ãã³ããå€ãã€ãªããã»ã©ãªãŒããŒããããå€ããªãéã«æªãçµæã«ãªãããšãããããŸããåæãšããŠä»¥äžã®äºå®ããããŸãã
- ã³ãã³ããå¢ããã°å¿ ããªãŒããŒãããã§ CPU æéã®ç·åèšã¯å¢ãã
- ããã«ããã¯ãšãªãäžçªé ãã³ãã³ããããéããªããªã
- ãã€ãééä¿¡ã«ãªãŒããŒãããããã
- ãã£ã«ã¿ã³ãã³ãã®åŠçããªãŒããŒãããã«ãªã
- ã³ãã³ãèµ·åã®ãªãŒããŒãããããã
- ãã€ãã©ã€ã³äžŠååã§ã¯äžŠåæ°ã倿Žããã®ãå°é£
- ã³ãã³ãã¯ãŸãšããæ¹ããªãŒããŒããããæžã
- 䞊ååäœã劚ããã³ãã³ãããã
ãããã€ãã©ã€ã³äžŠååã ãã§ CPU ã䜿ãåãããšãããªãã°ä»¥äžã®ããšã«çæããå¿ èŠããããŸãã
- ãã€ãã§ã€ãªãã ã³ãã³ãã®æ°ã¯ CPU ã³ã¢æ°ãšåãã«ããããš
- ãã€ãã§ã€ãªãããããã®ã³ãã³ãã®åŠçé床ãåãããããš
- 䞊ååäœã劚ããã³ãã³ãã䜿ããªãããš
çŸå®ã«ã¯äžèšã®ããšãéæããã®ã¯å°é£ã§ãããªããªãåŠçå 容ãå€ããªãããšã«ã¯ãã€ãã§ã€ãªãã³ãã³ãã®æ°ãå€ãããããããããã®ã³ãã³ãã§åãåŠçãããããšã¯ãªãã®ã§åŠçé床ãåãã«ããããšã¯ã§ãããåãã³ãã³ãã§ãå®è£ ã«ãã£ãŠåŠçé床ãç°ãªããç°å¢ã«ãã£ãŠ CPU ã³ã¢æ°ã¯éãããã§ãããŸã次ã®ãããªéæ¥çãªåé¡ããããŸãã
- 1 ã³ãã³ãã§ CPU æ§èœã䜿ãåãã®ã¯æ£ãããšã¯ãããªãïŒä»ã®åŠççšã«äœåãæ®ãïŒ
- å€ãã®ã³ãã³ããã€ãªãã¹ã¿ã€ã«ã¯å¯èªæ§ãäœããªã
ãããªããšããŒã¿äžŠååãã¿ã¹ã¯äžŠååãšèšã£ãä»ã®äžŠååæè¡ã䜿ãïŒäœµçšããïŒãããªãã®ã§ãã€ãã©ã€ã³äžŠååã«ãã ããçç±ã¯ãªããªããŸãããã¡ããããŒã¿äžŠååãã¿ã¹ã¯äžŠååãäžèœã®è§£æ±ºçã§ã¯ãªãã䞊ååŠçãè¡ãåã«ããŒã¿ãåå²ããªããã°ãããªãå Žåããã£ãããããŒã¿ã®æ§è³ªã«ãã£ãŠã¯ããŒã¿äžŠååãã¿ã¹ã¯äžŠååã䜿ããªãããšããããŸãããããã£ãå Žåã¯ãã€ãã©ã€ã³äžŠååãé©åãªå ŽåããããŸããããã®å Žåã§ãã¡ãããšèšæž¬ããŠããã«ããã¯ã調ã¹ãŠãã®éšåãæ¹åããªããã°å¹æã¯å šããããŸãããé广ã«ããªãããŸãã
çµè«ãšããŠã¯ãã€ãã©ã€ã³äžŠååã§ CPU ãå¹çãã䜿ãåãããšã¯ããªãé£ãããããã¿ã«ã³ãã³ããã€ãªããããã®ã¯ãã¡ãªããã®æ¹ã倧ããããªãŒããŒããããæžããããã«ããã€ãã§ã€ãªãã³ãã³ãã®æ°ã¯å¿ èŠæå°éïŒ3 ã 5 çšåºŠïŒã«ãšã©ããŠä»ã®äžŠååã䜵çšããæ¹ã CPU ãå¹çãã䜿ãåãããšãã§ãããšããããšã«ãªããŸãã
ãããã«ããã䞊ååã®ããã©ãŒãã³ã¹ãèªãã®ã§ããã°ä»¥äžã®ããšãå¿ãããªããã°ãããŸããã
- éã®åŒŸäžžïŒäžèœã®è§£æ±ºçïŒã¯ãªããšããèšèã®éããç¶æ³ã«å¿ããŠé©åãªæ¹æ³ã䜿ãããš
- å®éã®ãŠãŒã¹ã±ãŒã¹ã«è¿ãç¶æ³ã§ããã©ãŒãã³ã¹ã®èšæž¬ãããããš
- real ã ãã§ã¯ãªã user/sys ãèšæž¬ããŠã©ãã ã CPU ã³ã¢ã䜿çšããŠãããææ¡ããããš
ã·ã§ã«ã¹ã¯ãªãããããã°ã©ãã³ã°èšèªãªã®ã§ããã®ä»ã®èšèªã®æè¡ãå¿çšã§ããŸããã·ã§ã«ã¹ã¯ãªããã ãã®ç¬èªçè«ãªããŠãã®ã¯ãªãã®ã§ãã·ã§ã«ã¹ã¯ãªããã«ãªããã®ã¯ä»ã®èšèªãåèã«ãã¹ãã§ããã·ã§ã«ã¹ã¯ãªããã«ç¹åããŠãã€ãã©ã€ã³ã«ãã䞊ååŠçã®è©±ã詳ããæžããŠããããŒãžã¯æ®ã©ãããŸããããäžè¬çãªãã€ãã©ã€ã³äžŠååã®ç¹æ§ã¯ã·ã§ã«ã¹ã¯ãªããã«ãåœãŠã¯ãŸããŸãããããã®ããã€ããåŒçšããŠæåŸã«ããããšæããŸãã
ããã€ãã©ã€ã³äžŠååã§ã¯ïŒåã ã®ããŒã¿ã«å¯ŸããåŠçã«ãããæéãã®ãã®ã¯å€ãããŸããããããïŒäžŠååã®è² è·ãªã©ã§é ããªããŸãããã®ããïŒxãIntã®ãããªçµã¿èŸŒã¿ã®åã®å ŽåïŒãã®åŒã®ããããã®é¢æ°ã«ããåŠçã䞊ååãããšããã§æå³ã¯ãããŸããããããïŒxããªã¹ãã®ãããªè€æ°ã®å€ãæã€ããŒã¿åã ã£ãå Žåã¯ã©ãã§ããããïŒ é¢æ°fïŒgïŒhã¯æµãäœæ¥çã«ããããã®åŠçããã¹ãå€ãæ¥ããšããã§é©å®åŠçãè¡ãããšãã§ããããïŒããããã®é¢æ°ã®åŠçã䞊ååããã°å šäœçãªåŠçèœåïŒthroughputïŒã¹ã«ãŒãããïŒãåäžãããããšãã§ããŸãã
ãåœç¶ãªããïŒããããã«åŠçã«ãããæéã«åããããå Žåã«ã¯ïŒåŠçã«äžçªæéããããéšåãããã«ããã¯ïŒbottleneckïŒã«ãªã£ãŠããŸããŸãããã€ãã©ã€ã³äžŠååã¯ïŒé¢æ°ããã°ã©ãã³ã°ã®ã¹ã¿ã€ã«ã«äžçªè¿ãããïŒäžèŠäœ¿ãããããã«èŠããŸãããïŒæ§èœãåºãããã«ã¯ãã€ãã©ã€ã³ã®ããããã®æ®µïŒstageïŒã¹ããŒãžïŒã®åŠçæéãã§ããã ãåçã«ãªããã工倫ããå¿ èŠããããŸãã
åªãã䞊åããã©ãŒãã³ã¹ãéæããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ãé©åãªç²åºŠãæã€ããšãéèŠã§ããç²åºŠãšã¯ã䞊åã¿ã¹ã¯ã«ãããå®éã®åŠçéãæããŸããç²åºŠã现ãããããšéä¿¡ãªãŒããŒãããã«ãã£ãŠããã©ãŒãã³ã¹ãæãªãããç²åºŠãç²ããããšããŒãã»ã€ã³ãã©ã³ã¹ã«ãã£ãŠããã©ãŒãã³ã¹ãæãªãããŸããããŒãã»ã€ã³ãã©ã³ã¹ãšéä¿¡ãªãŒããŒããããåé¿ãã€ã€ã䞊åã¿ã¹ã¯ã«é©åãªç²åºŠ (äžè¬ã«å€§ããã»ã©è¯ã) ãèŠæ¥µããŠãåªããããã©ãŒãã³ã¹ãéæããããã«ããŸãã
é©çšã«åœãã£ãŠã®æ³šæ
ããã»ããµã®å©çšå¹çãäžããã«ã¯ïŒãã€ãã©ã€ã³ã®ååŠçã®å®è¡æéãã»ãŒåãã«ããå¿ èŠãã
ãã€ãã©ã€ã³å䞊ååã§ã¯ïŒããŒã¿åŠçã®ã¹ã«ãŒãããã¯åäžãããïŒ1åã®ããŒã¿ã«å¯ŸããåŠçæéã¯ççž®ãããªãããšã«æ³šæ