éå»æ°å¹Žéãç§ã¯ãããããã³ããããã³ã°ã¢ã«ãŽãªãºã ïŒããã¯ããªãŒããŒã¿æ§é ïŒã䜿çšããŠããŸãããç§ãã¡ã¯ããããèªåã§æžãããã¹ããã䜿çšã
ããããããã¯ããªãŒã匷åããããã«ç¬èªã®ã³ãŒãããã¹ããããã¯ããã¯ã®ããã€ããåããŠé©çšããã¢ã€ãã¢ãåŸããšãã§ãã 幞ããªããšã«ãã¢ã«ãŽãªãºã èªäœããã¹ãããå¿ èŠã¯ãªããããã©ãŒãã³ã¹ã®æž¬å®ã«éäžã§ããŸãã
ãã®èšäºãçããã«ãšã£ãŠèå³æ·±ããã®ã«ããããšæããŸãã ãŸã ãã®ãããªã¿ã¹ã¯ã«ééããŠããªã人ã«ãšã£ãŠã¯ããã®ãããªã¢ã«ãŽãªãºã ãå¯èœãªãã®ããããŠæãéèŠãªããšã«ã¯ãããããã©ãã§ã©ã®ããã«äœ¿çšãããã¹ããããŸãã¯äœ¿çšãããã¹ãã§ãªããã調ã¹ãããšã¯æçšã§ãã ãã³ããããã³ã°ãã¥ãŒã®éçºçµéšããã人ã«ãšã£ãŠã¯ãå®éçãªæž¬å®å€ãæ¯èŒããããšã¯èå³æ·±ããããããŸããã ç§èªèº«ã¯ãå°ãªããšããã®ãããªåºçç©ãèŠãããšããªãã
ã¯ããã«ïŒãã³ããããã³ã°ããŒã¿æ§é ãšã¢ã«ãŽãªãºã ãšã¯
ãã«ãã¹ã¬ããã®æŠå¿µã¯çŸä»£ã®ããã°ã©ãã³ã°ã«ãã£ãããšå ¥ã£ãŠããŸãããã¹ã¬ããã®æäœã¯åæããŒã«ãªãã§ã¯äžå¯èœã§ããããããã¥ãŒããã¯ã¹ãã»ããã©ãæ¡ä»¶å€æ°ãããã³ãããã®åå«ãç»å ŽããŸããã ãã ããæåã®æšæºé¢æ°ã¯ããªãéããäœéã§ãããã«ã«ãŒãã«å ã«å®è£ ãããŠããŸãããã€ãŸããååŒã³åºããžã®ã³ã³ããã¹ãåãæ¿ããå¿ èŠã§ããã åãæ¿ãæéã¯CPUã«ãããã«äŸåãããããããã»ããµãé«éã«ãªãã»ã©ãã¹ã¬ãããåæããããã«ããå€ãã®çžå¯Ÿæéãå¿ èŠã«ãªããŸãã ãã®åŸãæå°éã®ããŒããŠã§ã¢ãµããŒãã§ãåæã«è€æ°ã®ã¹ã¬ãããæäœããªããäžå€ã®ããŒã¿æ§é ãäœæããããšãã§ãããšããã¢ã€ãã¢ãæµ®äžããŸããã ããã«ã€ããŠãã£ãšç¥ããã人ã«ã¯ã ãã®åºçç©ã·ãªãŒãºããå§ãããŸãã
åºæ¬çãªã¢ã«ãŽãªãºã ãéçºãããé·ãç®±ã«å ¥ããããŸãããããŸã æéããããŸããã§ããã ã¡ãã»ãŒãžåŠçæéïŒã¬ã€ãã³ã·ïŒã®æŠå¿µãéåžžã®CPUé床ãããã»ãšãã©éèŠã«ãªã£ããšãã圌ãã¯ç¬¬äºã®äººçãè¿ããŸããã ããã¯äœã§ããïŒ
以äžã«ç°¡åãªäŸã瀺ããŸãã
ã¡ãã»ãŒãžãåä¿¡ããåŠçããå¿çãéä¿¡ãããµãŒããŒããããšããŸãã 100äžã®ã¡ãã»ãŒãžãåä¿¡ãããµãŒããŒããããã2ç§ã§åŠçãããšä»®å®ããŸããã€ãŸãããã©ã³ã¶ã¯ã·ã§ã³ããšã«2ãã€ã¯ãç§ã§ãããç§ã«é©ããŠããŸãã ããã¯åž¯åå¹
ãšåŒã°ãããã®ã§ãããã¡ãã»ãŒãžãåŠçããéã®æ£ãã尺床ã§ã¯ãããŸãã ã åŸã§ãç§ã«ã¡ãã»ãŒãžãéä¿¡ããåã¯ã©ã€ã¢ã³ãã1ç§ä»¥å
ã«å¿çãåä¿¡ããããšãç¥ã£ãŠé©ããŸããã å
æ°ïŒ èããããã·ããªãªã®1ã€ïŒãµãŒããŒã¯ãã¹ãŠã®ã¡ãã»ãŒãžããã°ããåä¿¡ãããããããããã¡ãŒã«è¿œå ããŸãã ãã®åŸããããã1ç§ããšã«äžŠè¡ããŠåŠçããŸãããããã2ç§ã§ãã¹ãŠããŸãšããŠåŠçããŸãã ããã«éãè¿ããŸãã ããã¯ãå
šäœãšããŠè¯å¥œãªã·ã¹ãã é床ã§ãããšåæã«ã蚱容ã§ããªãã»ã©é«ãã¬ã€ãã³ã·ãŒã®äŸã§ãã
Herb Sutterã® ã€ã³ã¿ãã¥ãŒã®å£°æã§è©³çŽ°ãèªãããšãã§ããŸãã圌ã¯ãããã«ç°ãªãæèã«ããŸããã圌ã¯ãã®åé¡ãéåžžã«æ°ãŸããã«è°è«ããŠããŸãã çŽæçã«ã¯ãé床ãšåŸ ã¡æéã®æŠå¿µã¯åãã§ããããã«èŠããŸããæåã®æŠå¿µã倧ããã»ã©ã2çªç®ã®æŠå¿µã¯å°ãããªããŸãã ããããããèŠããšããããã¯ç¬ç«ããŠãããçžé¢é¢ä¿ãããªãããšãããããŸãã
ããã¯éããããã³ã°æ§é ãšäœã®é¢ä¿ããããŸããïŒ æãçŽæ¥çãªããšã¯ãåŸ ã¡æéã®å ŽåããããŒãæžéãŸãã¯åæ¢ããããšãããšèŽåœçãªããšã§ãã ã¹ããªãŒã ãå®æ¥œæ»ãããã®ã¯ç°¡åã§ãããç®èŠããããšã¯ã§ããŸããã ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ã³ã¢ã ãã
ãã®ãããªæ§é ã®1ã€ã«ã€ããŠèª¬æããŸãã
ãã©ãããã©ãŒã ãžã®æåã®ã¢ãããŒã
ä»»æã®æ°ã®æžã蟌ã¿ããã³èªã¿åãã¹ããªãŒã ã§åæ¹åãã¥ãŒãå®è£ ããããŒã¹ã::ããã¯ããªãŒ::ãã¥ãŒã®ããããã®æ§é ã§ã®ã¿åäœããŸãã ãã®æ§é ã«ã¯2ã€ã®ããŒãžã§ã³ããããŸããå¿ èŠã«å¿ããŠã¡ã¢ãªãå²ãåœãŠã容éãç¡éã§ãããªãã·ã§ã³ãšãåºå®ãããã¡ã®ãªãã·ã§ã³ã§ãã å³å¯ã«èšãã°ãäž¡æ¹ãšããã³ããããã³ã°ã§ã¯ãããŸããã1ã€ç®ã¯ã·ã¹ãã ã¡ã¢ãªã®å²ãåœãŠãããã¯ããªãŒã§ã¯ãªãããã2ã€ç®ã¯é ããæ©ãããããã¡ããªãŒããŒãããŒããæžã蟌ã¿çšã®ã¹ããŒã¹ãã§ãããŸã§æžã蟌ã¿ã¹ããªãŒã ãç¡æéã«åŸ æ©ããããã§ãã æåã®ãªãã·ã§ã³ããå§ããŸããããæåŸã«åãã£ãŠãåºå®ãããã¡ãŒã®çµæãšæ¯èŒããŸãã
ãŸãã4ã³ã¢ã®Linux Mint-15ãããããšãä»ãå ããŸãã
ããããã³ãŒããåãåºããŠå®è¡ããŠã¿ãŸããããçµæã¯æ¬¡ã®ãšããã§ãã
boost ::ããã¯ããªãŒ::ãã¥ãŒã¯ããã¯ããªãŒ 40,000,000åã®ãªããžã§ã¯ããçæããŸããã 40,000,000åã®ãªããžã§ã¯ããæ¶è²»ããŸããã å®éã®0m15.332s ãŠãŒã¶ãŒ1m0.376s sys 0m0.064s
ã€ãŸããã¡ãã»ãŒãžããšã«çŽ400 nsã®ç°¡åãªæ¹æ³ã§åé¡ã«ã¢ãããŒãããã°ãååã«æºè¶³ã®ãããã®ã§ãã ãã®å®è£ ã¯intãæž¡ãã4ã€ã®èªã¿åãããã³æžã蟌ã¿ã¹ããªãŒã ãéå§ããŸãã
ã³ãŒããå°ãå€æŽããŠã¿ãŸããããç§ã¯ä»»æã®æ°ã®ã¹ã¬ãããå®è¡ãããã®ã§ãããçµ±èšã確èªããããšæããŸãã ãã¹ããé£ç¶ããŠ100åå®è¡ãããšãååžã¯ã©ããªããŸããïŒ

ããã§ã¯ãããªãåççã«èŠããŸãã X軞ã§ã¯ãããç§åäœã®åèšå®è¡æéãéä¿¡ã¡ãã»ãŒãžã®æ°ã§å²ã£ãå€ãY軞ã§ã¯ããã®ãããªã€ãã³ãã®æ°ã§ãã
ãããŠãããã¯ç°ãªãæ°ã®äœå®¶/èªè ã®çµæã§ãïŒ


ããã§ã¯ããã¹ãŠãããã»ã©ãã©è²ã§ã¯ãããŸãããååžãåºããããšã¯ãäœããæé©ã«æ©èœããŠããªãããšã瀺åããŠããŸãã ãã®å Žåããã®ãã¹ãã®èªã¿åãã¹ããªãŒã ã¯å¶åŸ¡ã決ããŠæŸæ£ããããã®æ°ãã³ã¢ã®æ°ã«è¿ã¥ããšãã·ã¹ãã ã¯ããããäžæããã ãã§ãã
ãã©ãããã©ãŒã ãžã®2çªç®ã®ã¢ãããŒã
ç¡é§ãªintãæž¡ã代ããã«ããã¹ãããã1ã€æ¹åããŠãæžã蟌ã¿ã¹ããªãŒã ãçŸåšã®æå»ãããç§åäœã§æ£ç¢ºã«éä¿¡ã§ããããã«ããŸãã ãã®åŸãåä¿¡è ã¯åã¡ãã»ãŒãžã®é 延ãèšç®ã§ããŸãã å®è¡ããŸãïŒ
ã¹ã¬ããïŒ1æžã蟌ã¿ã1èªã¿åã 倱æïŒ0ããã·ã¥ã3267ããã 垯åå¹ ïŒ177.864 ns ã¬ã€ãã³ã·ïŒ1.03614e + 08 ns
ãŸãããã¥ãŒããã®ã¡ãã»ãŒãžã®èªã¿åããšãã¥ãŒãžã®æžã蟌ã¿ã«å€±æããè©Šè¡åæ°ãã«ãŠã³ãããŸãïŒããã§ã®æåã®è©Šè¡ã¯ãåžžã«ãŒãã«ãªããŸããããã¯å²ãåœãŠãªãã·ã§ã³ã§ãïŒã
ããããããã¯ä»ã«äœã§ããïŒ çŽèŠ³çã«åããªãŒããŒïŒ200 nsïŒãæ³å®ããé 延ã¯ã100ããªç§ãçªç Žãã50äžå以äžã«ãªããŸãïŒ ããã¯ã§ããŸããã
ããããçµå±ã®ãšãããåã¡ãã»ãŒãžã®é 延ãããã£ãã®ã§ãããã§ãæŒããŠãªã¢ã«ã¿ã€ã ã§ã©ã®ããã«èŠãããã確èªããŸããããã»ã¹ãã©ã³ãã ã§ããããšããããããã«ãããã€ãã®åäžã®éå§ã®çµæã次ã«ç€ºããŸãã

äžåºŠã«1ã€ã®ã¹ããªãŒã ãèªã¿æžãããå Žåãããã³4ã€ã®å Žåãããã«ïŒ

äœãèµ·ãã£ãŠããã®ïŒ ä»»æã®ç¬éã«ãèªã¿åãã¹ããªãŒã ã®äžéšãã·ã¹ãã ã«ãã£ãŠéä¿¡ãããŠäŒæ¯ããŸãã ãã¥ãŒã¯æ¥éã«æé·ãå§ããã¡ãã»ãŒãžã¯ãã®äžã«ãããåŠçãåŸ æ©ããŠããŸãã ãã°ãããããšãç¶æ³ãå€ãããæžã蟌ã¿ã¹ããªãŒã ã®æ°ãèªã¿åãããå°ãªããªãããã¥ãŒããã£ãããšè§£æ±ºãããŸãã ãã®ãããªå€åã¯ãããªç§ããç§ã®æéã§çºçãããã¥ãŒã¯ãããã¢ãŒãã§åäœããŸã-100äžä»¶ã®ã¡ãã»ãŒãžãèšé²ããã100äžä»¶ãèªã¿åãããŸãã åæã«ãããã©ãŒãã³ã¹ã¯éåžžã«é«ããŸãŸã§ãããåã ã®ã¡ãã»ãŒãžã¯ãããããã¥ãŒã§æ°ããªç§ãè²»ããå¯èœæ§ããããŸãã
ç§ãã¡ã¯äœãããŸããïŒ ãŸããèããŠã¿ãŸãããããã®åœ¢åŒã®ãã¹ãã¯æããã«äžååã§ãã ç§ãã¡ã®åœã§ã¯ãã¢ã¯ãã£ããªã¹ã¬ããã®ååã¯ã¡ãã»ãŒãžããã¥ãŒã«æ¿å ¥ããã ãã§ããžãŒã§ããããã¯å®éã®ã·ã¹ãã ã§ã¯çºçããŸãããèšãæããã°ããã¹ãã¯ãã©ãã£ãã¯ããã·ã³ãããåªãããã¯ãŒãçæããããã«èšèšãããŠããŸãã
å ¥åãã©ãã£ãã¯ãå¶éããå¿ èŠããããŸãããã¥ãŒã®åãšã³ããªã®åŸã«usleepïŒ0ïŒãæ¿å ¥ããã ãã§ãã ç§ã®ãã·ã³ã§ã¯ãããã«ããè¯å¥œãªç²ŸåºŠã§50ÎŒsã®é 延ãçºçããŸãã èŠãŠã¿ãŸãããïŒ

èµ€ãç·ã¯é 延ãªãã®æåã®ãã¹ãã§ãç·ã®ç·ã¯é 延ããã§ãã
ããã¯ãŸã£ããå¥ã®åé¡ã§ããçµ±èšãèšç®ã§ããããã«ãªããŸããã
Xã®èš±å®¹å¯èœãªã¹ã±ãŒã«ãç¶æããããã«ãæžã蟌ã¿ããã³èªã¿åãã¹ããªãŒã ã®æ°ã®ããã€ãã®çµã¿åããã®çµæã以äžã«ç€ºããŸããæ倧ãµã³ãã«ã®1ïŒ ãç Žæ£ãããŸãã

ã¬ã€ãã³ã·ã¯ç¢ºå®ã«300 ns以å ã«ãšã©ãŸãããã£ã¹ããªãã¥ãŒã·ã§ã³ããŒã«ã®ã¿ãããã«æ¡å€§ããããšã«æ³šæããŠãã ããã
ãããŠããããã1ã€ãš4ã€ã®æžã蟌ã¿ã¹ããªãŒã ã®çµæã瀺ããŸãã


äž»ã«å°Ÿã®æ¥æ¿ãªæé·ã«ãããé 延ãå€§å¹ ã«å¢å ããŸãã ç¹°ãè¿ããŸãããã¿ã€ã ã¹ã©ã€ã¹ã®éçºäžã«ã¢ã€ãã«ç¶æ ãç¶ç¶çã«çºçãã4ã€ã®ã¹ã¬ããïŒ== CPUïŒããããå¶åŸ¡äžèœãªå€æ°ã®ã¹ããŒããŠã³ãçºçããããšãããããŸãã å¹³åé 延ã¯ç¢ºå®ã«600 ns以å ã«ãšã©ãŸããŸãããäžéšã®ã¿ã¹ã¯ã§ã¯ãããã¯æ¢ã«èš±å®¹ç¯å²å ã«ãããŸããããšãã°ãTKãç¹å®ã®æéå ã«ã¡ãã»ãŒãžã®99.9ïŒ ãé ä¿¡ããããšãæ確ã«èŠå®ããŠããå Žåã§ãïŒããã¯ç§ã«èµ·ãããŸããïŒã
ãŸããåèšå®è¡æéã150åããšã«ã©ãã ã䌞ã³ããã«ã泚æããŠãã ããããã¯ãæåã«äœæããã¹ããŒãã¡ã³ãã®ãã¢ã³ã¹ãã¬ãŒã·ã§ã³ã§ã-æå°ã¬ã€ãã³ã·ãšæ倧é床ã¯åæã«éæãããŸããã äžç¢ºå®æ§ã®ç¬ç¹ã®ååã
å®éã«ã¯ããã¹ãããæãåºãããšãã§ããã®ã¯ããã ãã§ãã é 延ãé«ç²ŸåºŠã§æž¬å®ããå€ãã®ã¢ãŒãã§å¹³åã¬ã€ãã³ã·ãäœæ¡ã倧ãããªãããšãããæ£ç¢ºã«ã¯é 延ã®å¹³åã®æŠå¿µãæå³ã倱ãããšã瀺ããŸããã
æåŸã«æåŸã®è³ªåãèããŠã¿ãŸãããã
åºå®å®¹éãã¥ãŒã¯ã©ãã§ããïŒ
åºå®å®¹éã¯ãboost :: lockfree ::åºå®ãµã€ãºã®å éšãããã¡äžã«æ§ç¯ããããã¥ãŒã®å¥ã®å€åœ¢ã§ãã ããã«ãããäžæ¹ã§ã¯ã·ã¹ãã ã¢ãã±ãŒã¿ãŒãžã®ã¢ã¯ã»ã¹ãåé¿ã§ããŸããä»æ¹ã§ã¯ããããã¡ãŒããã£ã±ãã®å Žåãæžã蟌ã¿ã¹ããªãŒã ãåŸ æ©ããå¿ èŠããããŸãã äžéšã®çš®é¡ã®ã¿ã¹ã¯ã§ã¯ãããã¯å®å šã«é€å€ãããŸãã
ããã§ã¯ãåãæ¹æ³ã§äœæ¥ããŸãã ãŸããçµéšã«åºã¥ããŠãé 延ã®ãã€ããã¯ã¹ãèŠãŠã¿ãŸãããã

èµ€ãã°ã©ãã¯ãããŒã¹ãã®äŸã§äœ¿çšãããŠãã128ãã€ãã«å¯Ÿå¿ããç·ã®ã°ã©ãã¯ãå¯èœãªæ倧ã®65534ãã€ãã«å¯Ÿå¿ããŸãã
ã¡ãªã¿ã«
ããã¥ã¡ã³ãã«ã¯ãæ倧ãµã€ãºã¯65535ãã€ãã§ãããšæžãããŠããŸã-ãããä¿¡ããªãã§ãã ãããã³ã¢ãã³ããååŸããŠãã ãã
人çºçãªé 延ãæ¿å ¥ããªãã£ãããããã¥ãŒããããã¢ãŒãã§åäœãã倧éšåãæºãããã解æŸãããã®ãèªç¶ã§ãã ãã ããåºå®ãããã¡å®¹éã«ããç¹å®ã®é åºãå°å ¥ãããé 延ã®å¹³åãå°ãªããšãååšããããšãæ確ã«ããããŸãã
ããã§ãããã®ãªãã·ã§ã³ããã«ãã¹ã¬ããããã°ã©ã ã§ã©ã®ããã«åäœããããè©äŸ¡ããŠã¿ãŸãããã

ãã®ãããªæ確ãª2ã€ã®ã°ã«ãŒããžã®åå²ãèŠãã®ã¯å°ãäºæ³å€ã§ãããèªè ã®é床ããç§ãã¡ãåæããæ°çŸããç§ã®é床ãè¶ ããã©ã€ã¿ãŒã®é床ãäžåããéã«æ倧ã§30-40ãã€ã¯ãç§ã«è·³ãäžããããããç§ã®ãã·ã³ã®ã³ã³ããã¹ããåãæ¿ããæã ãšæãããŸãã ããã¯128ãã€ãã®ãããã¡ãŒã®çµæã§ãã64Kã®å Žåã¯éåžžã«äŒŒãŠãããå³åŽã®ã°ã«ãŒãã®ã¿ãæ°åããªç§é ããŸã§farãäžãããŸãã
ããã¯è¯ãã§ããæªãã§ããïŒ ã¿ã¹ã¯ã«äŸåããŸãããäžæ¹ã§ãé 延ãã©ããªæ¡ä»¶äžã§ã40ÎŒsãè¶ ããªãããšãèªä¿¡ãæã£ãŠä¿èšŒã§ããŸããããã¯è¯ãããšã§ãã äžæ¹ããã®å€æªæºã®æ倧é 延ãä¿èšŒããå¿ èŠãããå Žåã¯ãèŠåŽããŸãã ããšãã°ãã¡ãã»ãŒãžåŠçã®ããããªå€æŽã«ãããªãŒããŒ/ã©ã€ã¿ãŒã®ãã©ã³ã¹ã®å€åã¯ãé 延ã®æ¥æ¿ãªå€åã«ã€ãªããå¯èœæ§ããããŸãã
ãã ããã·ã¹ãã ãåŠçã§ãããããæããã«éãã¡ãã»ãŒãžãçæãïŒäžèšã®åçãã¥ãŒã«é¢ããã»ã¯ã·ã§ã³ãåç §ïŒã劥åœãªé 延ãæ¿å ¥ããããšããããšãæãåºããŠãã ããã

ããã¯ãã§ã«éåžžã«åªããŠããã2ã€ã®ã°ã«ãŒãã¯å®å šã«ã¯ããŒãžãããŸããã§ããããæ£ããã°ã«ãŒãã¯æ倧ã¬ã€ãã³ã·ã600 nsãè¶ ããªãããã«è¿ã¥ããŸããã ç§ã®èšèãèããŠãã ããã倧ããªãããã¡ã®çµ±èšã¯64Kã§ããŸã£ããåãããã«èŠããŸãããããããªéãã§ã¯ãããŸããã
çµè«ã«ç§»ãæã§ã
çµéšã®ãã人ããã¹ãçµæããèªåèªèº«ã«åœ¹ç«ã€äœããæœåºã§ããããšãé¡ã£ãŠããŸãã ããã«ç§ãèªåã§æãããšã瀺ããŸã
- é床ã®ã¿ã«é¢å¿ãããå Žåããã¹ãŠã®ãªãã·ã§ã³ã¯ã»ãŒåçã§ãããã¡ãã»ãŒãžãããæ°çŸããç§ã®ãªãŒããŒã®å¹³åæéãåŸãããŸãã ãã®å Žåãfixed_capacityãã¥ãŒã¯ãäžå®éã®ã¡ã¢ãªãå æããããããã軜éã§ãã ãã ããããšãã°ããã¬ãŒãªã©ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãèªã¿åãã¹ããªãŒã ãã§ããã ãæ©ãã解æŸãããããšãéåžžã«éèŠã§ãããã®å Žåãå²ãåœãŠãã¥ãŒã®æ¹ãåªããŠããäžæ¹ã§ãã¡ã¢ãªãç¡å¶éã«æ¶è²»ããå¯èœæ§ããããŸãã
- ã¬ã€ãã³ã·ã®æå°åãåã¡ãã»ãŒãžã®åŠçæéãåå¥ã«å¿ èŠãšããå Žåãç¶æ³ã¯è€éã§ãã æžã蟌ã¿ã¹ããªãŒã ïŒãã¬ãŒïŒããããã¯ããããªãã¢ããªã±ãŒã·ã§ã³ã®å Žåãå²ãåœãŠãªãã·ã§ã³ãéžæãã䟡å€ããããŸãã ã¡ã¢ãªãéãããŠããå Žåãfixed_capacityãæé©ã§ããä¿¡å·ã®çµ±èšã«åºã¥ããŠãããã¡ãµã€ãºãéžæããå¿ èŠããããŸãã
- ãããã«ãããã¢ã«ãŽãªãºã ã¯ããŒã¿ã¹ããªãŒã ã®åŒ·åºŠã«é¢ããŠäžå®å®ã§ãã ç¹å®ã®é倧ãªãããå€ãè¶ ãããšãé 延ãæ°æ¡ãžã£ã³ãããå®éã«ïŒæ£åŒã§ã¯ãªããïŒã©ã€ã³ãããããã³ã°ã«ãªããŸãã ååãšããŠãããããã³ã°ã¢ãŒãã«é¥ãããšãªãã·ã¹ãã ãåäœãããã«ã¯ã埮調æŽãå¿ ââèŠã§ãã
- å ¥åã¹ããªãŒã ãšåºåã¹ããªãŒã ã®å®å šãªåé¢ã¯ãå²ãåœãŠããŒãžã§ã³ã§ã®ã¿å¯èœã§ãããããã¯å¶åŸ¡ãããŠããªãã¡ã¢ãªæ¶è²»ãšå¶åŸ¡ãããŠããªãé·ãé 延ã«ããå®çŸãããŸãã
- Fixed_capacityã䜿çšãããšãæ倧ã¬ã€ãã³ã·ãåççãªå¶éã«å¶éããªãããé«éããŒã¿è»¢éãå®çŸã§ããŸãã fixed_capacityãã¥ãŒèªäœã¯ãæ¬è³ªçã«éåžžã«è»œéãªæ§é ã§ãã äž»ãªãã€ãã¹ç¹ã¯ãèªè ãäœããã®çç±ã§å¯ŸåŠãŸãã¯ããªãŒãºã§ããªãå Žåãæžã蟌ã¿ã¹ããªãŒã ããããã¯ãããããšã§ãã ç§ã®æèŠã§ã¯ã倧ããªãµã€ãºã®ãããã¡ã¯ãã£ãã«å¿ èŠãšãããŸããããããã¯ãå²ãåœãŠãã¥ãŒã«è¿ããéæž¡çãªãã€ããã¯ã¹ãå®çŸããŸãã
- ç§ã«ãšã£ãŠéåžžã«äžæå¿«ãªé©ãã¯ããã€ããã¯ã¹ã«å¯Ÿããã¢ã€ãã«ãªãŒãã£ã³ã°ã¹ããªãŒã ãç¶ç¶çã«æ©èœããããšã®å€§ããªæªåœ±é¿ã§ããã ã¹ã¬ããã®åèšæ°ãCPU以äžã®å Žåã§ãã100ïŒ ãæ¶è²»ããå¥ã®ã¹ã¬ãããè¿œå ããŠãæ¹åãããŸãããããã€ããã¯ã¹ãæªåããŸãã ããããã®éèŠãªã¹ã¬ããã«å¥ã ã®ã³ã¢ãå²ãåœãŠãããŠããå Žåãã倧èŠæš¡ãµãŒããŒãã®æŠç¥ã¯åžžã«æ©èœãããšã¯éããŸããã
- ããã«é¢ããŠãèšåãããŠãããããŸã 解決ãããŠããªãåé¡ã®1ã€ã¯ãã€ãã³ããåŸ
æ©ããŠããã¹ã¬ãããå¹ççã«äœ¿çšããæ¹æ³ã§ãã ããªãããããã¹ãªãŒãç¶æ
ã«ããå Žå-ä»ã®ã¿ã¹ã¯ã«äœ¿çšãããå Žåãã¬ã€ãã³ã·ãŒ
ã«ã«ãã¯èŽåœçã«æãªãããŸã-ã¿ã¹ã¯ããã¿ã¹ã¯ã«ãã°ããåãæ¿ããåé¡ãçºçããŸãã çæ³ãžã®é©åãªè¿äŒŒã¯ãèªã¿åãã¹ããªãŒã ãè¿œå ããŠ:: io_serviceãããŒã¹ãããå°ãªããšããŸããªã€ãã³ããå¹ççã«åŠçã§ããããã«ããããšã ãšæããŸãã 誰ããäœãã¢ã€ãã¢ãæã£ãŠãããã©ããèããŠããããã§ãã
ã³ãŒããå¿
èŠãªäººåã
#include <boost/thread/thread.hpp> #include <boost/lockfree/queue.hpp> #include <time.h> #include <atomic> #include <iostream> std::atomic<int> producer_count(0); std::atomic<int> consumer_count(0); std::atomic<unsigned long> push_fail_count(0); std::atomic<unsigned long> pop_fail_count(0); #if 1 boost::lockfree::queue<timespec, boost::lockfree::fixed_sized<true>> queue(65534); #else boost::lockfree::queue<timespec, boost::lockfree::fixed_sized<false>> queue(128); #endif unsigned stat_size=0, delay=0; std::atomic<unsigned long>* stat=0; std::atomic<int> idx(0); void producer(unsigned iterations) { timespec t; for (int i=0; i != iterations; ++i) { ++producer_count; clock_gettime(CLOCK_MONOTONIC, &t); while (!queue.push(t)) ++push_fail_count; if(delay) usleep(0); } } boost::atomic<bool> done (false); void consumer(unsigned iterations) { timespec t, v; while (!done) { while (queue.pop(t)) { ++consumer_count; clock_gettime(CLOCK_MONOTONIC, &v); unsigned i=idx++; v.tv_sec-=t.tv_sec; v.tv_nsec-=t.tv_nsec; stat[i]=v.tv_sec*1000000000+v.tv_nsec; } ++pop_fail_count; } while (queue.pop(t)) { ++consumer_count; clock_gettime(CLOCK_MONOTONIC, &v); unsigned i=idx++; v.tv_sec-=t.tv_sec; v.tv_nsec-=t.tv_nsec; stat[i]=v.tv_sec*1000000000+v.tv_nsec; } } int main(int argc, char* argv[]) { boost::thread_group producer_threads, consumer_threads; int indexed=0, quiet=0; int producer_thread=1, consumer_thread=1; int opt; while((opt=getopt(argc,argv,"idqr:w:")) !=-1) switch(opt) { case 'r': consumer_thread=atol(optarg); break; case 'w': producer_thread=atol(optarg); break; case 'd': delay=1; break; case 'i': indexed=1; break; case 'q': quiet=1; break; default : return 1; } int iterations=6000000/producer_thread/consumer_thread; unsigned stat_size=iterations*producer_thread*consumer_thread; stat=new std::atomic<unsigned long>[stat_size]; timespec st, fn; clock_gettime(CLOCK_MONOTONIC, &st); for (int i=0; i != producer_thread; ++i) producer_threads.create_thread([=](){ producer(stat_size/producer_thread); }); for (int i=0; i != consumer_thread; ++i) consumer_threads.create_thread([=]() { consumer(stat_size/consumer_thread); }); producer_threads.join_all(); done=true; consumer_threads.join_all(); clock_gettime(CLOCK_MONOTONIC, &fn); std::cerr << "threads : " << producer_thread <<" write, " << consumer_thread << " read" << std::endl; std::cerr << "failed : " << push_fail_count << " pushes, " << pop_fail_count << " pops" << std::endl; fn.tv_sec-=st.tv_sec; fn.tv_nsec-=st.tv_nsec; std::cerr << "bandwidth: " << (fn.tv_sec*1e9+fn.tv_nsec)/stat_size << " ns"<< std::endl; double ct=0; for(auto i=0; i < stat_size; ++i) ct+=stat[i]; std::cerr << "latency : "<< ct/stat_size << " ns"<< std::endl; if(!quiet) { if(indexed) for(auto i=0; i < stat_size; ++i) std::cout<<i<<" "<<stat[i]<<std::endl; else for(auto i=0; i < stat_size; ++i) std::cout<<stat[i]<<std::endl; } return 0; }