æè¿ãååããäŒè°ã«è¡ãçç±ããšãYouTubeã§ãããªãèŠãçç±ãã«ã€ããŠæ¢ã«ããç¥ã£ãŠãã質åãããŸããã ããã¯å人ã§ãããarbitraryæçãªäººç©ã§ã¯ãªãããããã詳现ã«ã詳现ã«ããããŠãã³ãã¯ã«ã€ããŠçããããšæããŸããã æ®å¿µãªãããã©ã€ãã¢ãŒãã§ã®ã©ã€ãã¢ãŒãã§ã¯ããããè¡ãã®ã¯å°é£ã§ãããã¹ãŠã®è©³çްã«ã€ããŠã¯èšåããŸããã äžæ¹ãããã¯ãããã¹ãã«æé©ãªãããã¯ã§ãã詳现ãªã¬ãã¥ãŒã1åæžããŠãããçã®ç€ŸäŒææçè
ãšããŠãHabrãžã®ãªã³ã¯ã§ãã¹ãŠã®è³ªåã«çããããšãã§ããŸãã
ã¢ã€ãã¢ã¯ç°¡åã§ããJPoint2017ããæã人æ°ã®ããã¬ããŒããå
¥æãããããäœã§ãããããªããããã¯ãŒã«ã§ããªãç§ããããå人çã«å¿
èŠãšããã®ããç°¡åã«èšãçŽããŠãã ããã ãããã®åã¬ããŒãã¯åå¥ã®åæã«å€ããŸãããæåã¯ããã10ã®ç°¡åãªæŠèŠã§ãã è¡ããïŒ

è峿·±ãããšã«ããã®äŒè°ã§2ã€ã®åºèª¿è¬æŒããããã«ãªããŸããã åºèª¿è¬æŒã¯ãå®çŸ©ã«ãããäŒè°ã®ç²Ÿç¥ãšããŒã³ãèšå®ããŸã;圌ãã¯ãã€ã³ã¹ãã¬ãŒã·ã§ã³ããšãèªåã®èŠéãåºãããããã«èšèšãããŠããŸãã çãæè¡äŒè°ã§åºèª¿è¬æŒãè¡ãã«ã¯ããããè¡ãå¿
èŠããããŸãã ãã ãããããã¯ãã¹ãŠããã«ãããŸãã ããã°ã©ã å§å¡äŒã¯ãããç°¡åãªæ¹æ³ã§éæããŸãããæåã®åºèª¿è¬æŒã¯äŒçµ±çã«äººæ°ã®ããç§åŠãããã§ããã2çªç®ã¯ã·ãã¬ãïŒè¬æŒè
-åç¯è
ãæé«ã®ã¬ããŒãã®é£ç¶ã¡ãŒã«ãŒïŒã§ãã
ã¬ããŒããèŠããšãã®æ°æã¡ãæ¯èŒããããã«ãããããã®é£ã«äŒè°åå è
ã®å¹³åè©äŸ¡ã衚瀺ãããŸãã
ã¹ããŒã«ãŒïŒAlexey Savvateev; è©äŸ¡ïŒ4.38±0.04ã
ç§åŠãç¹ã«æ°åŠãšã²ãŒã çè«ã®æ®åè
ããã®é®®æãªã¬ããŒãã ãã®ã¬ããŒãã¯ãç§ãã¡èªèº«ã®ç ç©¶ãšããªãªããŒã»ããŒããšãã³ã¯ãã»ãã«ã ã¹ãããŒã ã®ç ç©¶ïŒ2016幎ããŒãã«çµæžåŠè³ãå¥çŽçè«ã«äžãããããã®ïŒã«åºã¥ããŠããŸãã
ãŸããã²ãŒã ã®çè«ãšå¥çŽã«é¢ããåºæ¬çãªããšãå¿ããïŒãŸãã¯ç¥ããªãã£ãïŒäººã®ããã«ãããã€ãã®å
¥éæ
å ±ãæäŸãããŸãã ããã«ãããåºèª¿è¬æŒãšãããŒãã³ã¢ããšãåºå¥ãããŸããèè
ã¯ã倧åŠã§å€§åŠã«åæ Œããªãã£ã人ã¯èª°ã§ãç«ã¡äžãã£ãŠããŒã«ãå»ã£ãããšã¯èšããŸããã§ããã 代ããã«ã圌ã¯äŸã§ãããã¯ãç°¡æœãã€ãããããã説æããŠããã®ã§ã誰ã«ã§ãæããã«ãªããŸãã ããšãã°ãå¥çŽã®çè«ã¯æ¬¡ã®ããã«äœ¿çšã§ããŸãïŒäœããã®çš®é¡ã®éåžžã®ã³ãŒãã£ã³ã°ãªãã£ã¹ãããå Žåããã¹ãŠã®é¢ä¿è
ïŒåŽåè
ãéçšäž»ãªã©ïŒã®ã¢ãã«ãæ§ç¯ãããå°æ¥ãéçšäž»ã¯çŽæ¥æ³šæã䜿çšããŠãã®ã·ã¹ãã ã管çã§ããªããªããŸãããããŠã现ããéžæãããåºæ¿ã䜿çšããŸãã
ã¢ã¬ã¯ã»ã€ã¯ããã®ãããªå¥çŽã®å€ãã®äŸãæããŠããŸãã ããšãã°ã誀ã£ãŠéžæããã«ãŒã«ã䜿çšããŠã誀ã£ãŠè»ã®äº€éããããã¯ããæ¹æ³ã«ã€ããŠèª¬æããŠããŸãã èŠããã«ãäžè¬çãªã¿ã¹ã¯ã¯ããã»ã¹ãæ£ããæŽçããæ¹æ³ã§ãã
äžé£ã®äŸã䜿çšããŠãã¿ãŒã³ã¹ã¿ã€ã«åé¡ã®äŸã䜿çšããŠããã·ã¥åè¡¡ã説æããŸãã ããã·ã¥ã¯ãæ ç»ããã€ã³ãã²ãŒã ãºãã®äž»äººå
¬ã ã£ãåå¿ã§ããã1994幎ã«ããŒãã«çµæžåŠè³ã2015å¹Žã«æ°åŠã®ã¢ãŒãã«è³ãåè³ããŸãããã²ãŒã ã®åè¡¡ã®ååšã«é¢ããéåžžã«äžè¬çãªå®çã蚌æããŸããã ãéããã®äŸ¡å€ã«å¯Ÿããä¿¡é Œã倧åŠã§ã®æè²ã®è³ªã«å¯Ÿããçžå¯Ÿçãªä¿¡é Œãªã©ã®å®éã®äŸã瀺ãããŠããŸãã
ã¬ããŒãã®éäžã§AlexeyãèŽè¡ãšäžç·ã«ãã¬ã€ã³ã¹ããŒãã³ã°ãäŒç»ããããšã¯éåžžã«ã¯ãŒã«ã§ãããããŠãèŽè¡ã®äžã«äŒè©±ããµããŒãã§ãã人ã
ãæ¬åœã«ããŸããã éåžžããã®ãããªè©Šã¿ã¯åãã«èŠããŸããããã®å Žåããããã¯ã¬ããŒãã®äžéšã§ããããã«æãããŸããã æ®å¿µãªããããããã¬ã³ãŒãã§æããããšã¯ã§ããŸããããããã¯ç§ãã©ã€ãã§åºåžããæ°å°ãªãã¬ããŒãã®1ã€ã§ãã ããšãã°ããã®åœ¢åŒã§ã¯ãã¿ãŒã³ã¹ã¿ã€ã«ã®åé¡ã®2çªç®ã®éšåã«ã€ããŠèª¬æããŸããã

ãããŠæåŸã«ãããã«åºã¥ããŠãã¬ããŒãã®äžå¿çãªãããã¯ã«é²ã¿ãŸããé«ã¬ãã«ã®è
æã䌎ãè±çšã®åé¡ã解決ããããã«ã¹ããŒã«ãŒã«æ±ããããæ¹æ³ã§ãã ã¢ãã«ãæ§ç¯ãããåé¡ã圢åŒåããããã®åé¡ã¯ã²ãŒã çè«ã®æ çµã¿ã®äžã§è§£æ±ºãããŸãããã®éã«ãéåžžã«è峿·±ãçµæãšèŠ³æž¬ãããã€ãèŠã€ãããŸãã
äžè¬çã«èšãã°ãããã¯éèŠãªèšäºã§ããã¯ãã§ããããã²ãŒã çè«ã®ç§ã®ç¥èãåœŒã®æŠå Žã§æ¬ç©ã®ç§åŠè
ãæ¹å€ããã®ã«ååã§ã¯ãªãããšã¯æããã§ãã åœŒã¯æ£ããã¢ãã«ãéžæããŸãããïŒ èšç®ã¯æ£ããã§ããïŒ ã¯ããå°çã¯ç¥ã£ãŠããŸãã ãŸã第äžã«ãèè
ã®èãæ¹ã«å€¢äžã«ãªããŸãããããã¯ãã¬ããŒãã®ãããªé²ç»ãšã©ã€ãã³ãã¥ãã±ãŒã·ã§ã³ã®äž¡æ¹ã§è¿œè·¡ã§ããŸãã ãã®èãæ¹ã¯ææžãã®ãããªãã®ã§ãã
ãããã«ããããã¹ãŠã®ããã°ã©ããŒãããã°ã©ãã³ã°èšèªã§ã¢ããªã³ã°ã®åé¡ã解決ããŸãããAlexeiã®å Žåãéåžžã«é«åºŠãªæ°åŠçæœè±¡åã«ãã£ãŠåŒãåºãããéåžžã«è€éãªå®éã®åé¡ã«ã€ããŠè©±ããŠãããããéåžžã«çŽæã«åããçµè«ãæ§ç¯ããå®éã«ãã¹ãããããšãã§ããŸãã ç§ã«ãšã£ãŠããã®ã¬ããŒãã®åºèª¿è¬æŒã®äŸ¡å€ã¯ãŸãã«ãã®äžã«ãããŸããç°ãªãç®ã§åçŽãªãã®ã®ããããªãã¯ã¹ããèŠå§ãããšããçªç¶ã®åçºãšæŽå¯ã®ç¬éã«ã
ã¹ããŒã«ãŒïŒAlexei ShipilevïŒRed HatïŒ; è©äŸ¡ïŒ4.38±0.03ã
å¥ã®åºèª¿è¬æŒãä»åã¯ããââã©ãŒãã³ã¹ã«ã€ããŠã ãŸããLeshaã¯éçºãæåãããããã®åºæºã«ã€ããŠèª¬æããŸãã ãã¡ãããããžãã¹ã®äž»ãªåºæºã¯ç¥å¥ªã§ãããããã°ã©ããŒã¯å€§éã®çå°ã皌ãã§ãããšèšã£ãŠãæèœã«èŽè¡ã«ãã ãããŸãïŒ
芳客ã¯ãäžèŸããå埩ããŠããŸããããç ²æã¯èŠåå¡ãšã®ã³ãã¥ãã±ãŒã·ã§ã³ãªã©ããã£ãšæ²ããæè¡çãªããšããå§ãŸããŸãã ãããžã§ã¯ãã®æåã«æã圱é¿ãäžããããã©ãŒãã³ã¹ã¯ãæãéèŠãªããšã§ã¯ãªããšçµè«ä»ããããŸãã ããã©ãŒãã³ã¹ã«åŸäºããŠããç·ãããããèãã®ã¯é¢çœãã§ã-éåžžããã¹ãŠã®ã·ã®ã¯åœŒã®æ²Œãè³è³ããŸãã
次ã«ãæ£ããããã°ã©ã ãšé«éããã°ã©ã ãæ¯èŒããã ååãcurveã®æ²ç·ã®ã¹ã©ã€ãã衚瀺ãããŸãã ç§èŠããã®ã¹ã©ã€ãã¯ããã¹ãŠã®äžè¬çãªç»åã§èªåèªèº«ãèŠã€ããããšãã§ããæãåçºçãªç¬éã®äžã€ã§ãã ã¬ããŒãã®ã¹ã©ã€ãã1ã€ã ã衚瀺ãããå Žåã¯ãããã«ãããŸãã

Leshaã¯ããã€ã¢ã°ã©ã ã®ãã¹ãŠã®ã¬ãã«ãæ³šææ·±ãèŠãŠãããŸããå人çã«ã¯ããããã®èæ
®äºé
ã¯éåžžã«æç¢ºãªçšéãæã£ãŠããŸãã ããšãã°ãããã¯ãããã©ãŒãã³ã¹æŠç¥ãå®çŸ©ãããæ£åžžãªãããã¡ã€ã«ãäœæãããããŸã£ãããããã¡ã€ã«ãäœæããå¿
èŠããªããïŒã°ãªãŒã³ãŸãŒã³ã«ããå ŽåïŒãªã©ã®æå®³ãªçºèšã«å¯ŸåŠããããã®ååã«åœ¢åŒåãããåŒæ°ã®ãªã¹ãã§ãã éã¯ãŸãããã¹ãŠã®çŽäºã®äž»ãªè°è«ãšããŠãææå°æ©ãªæé©åãã§è°è«ãããŠããŸãã ãããŠãäžåžãžã®ããã©ãŒãã³ã¹ãåäžãããããã«äœåã販売ããæ¹æ³ã ãããŠãæ°ããè¶
é«éããŒã¿ããŒã¹ãªã©ããŠãŒã¶ãŒãäœããã®ã²ãŒã ã販売ããããã«ãªã£ããšãã«ã©ããããã
ããã€ãã®ã¹ã©ã€ããå°ç¡ãã«ããŸãã


ãã®ãããªã¹ã©ã€ãã¯æ³åãçµ¶ããéããããããã¯ç¹åŸŽçã§ã-ãããã¯ãã¹ãŠå³å¯ã«ã±ãŒã¹ã«ãããŸãã ããã¯ãäžè¬ã«ãããã«ãã£ãŠçèšãç«ãŠãŠããç·ã«æåŸ
ãããããšã§ããã ããã¯ããçš®ã®æ¥µç§ã®ç¥èã§ãããšã¯èšããŸããããç§ã«ãšã£ãŠã®äŸ¡å€ã¯æãæç¢ºã§ãªããããªèšèé£ããšæ
å ±ã®æŽçã«ãããŸãã
ãã¡ãããäŸã¯å°é£ã§ããã³ã³ãã€ã«é床ã2åãã8åã«äœäžããjavacã®ã³ãŒãã®äžéšã Amdalã®æ³åãšUniversal Scalability Lawã«ãã蚌æãªã©ã ã¬ã·ã£ã¯ä»ã®äŸãã©ãã§æã«å
¥ããŸããïŒ
äžéšã®ããã©ãŒãã³ã¹ã®å°éå®¶ã¯çŸåšãã¹ããŒã«ãŒã«å¯Ÿããandã¿ãæ±ããŠããã®ã§ã¯ãªãããšããç念ããããŸããããã¬ããŒãã§ã¯ã圌ã¯ãã¹ãŠã®äž»èŠãªç§å¯ãšåè°ã®ãããã¯ãééããããã§ãã
ã¹ããŒã«ãŒïŒAndrey BreslavïŒJetBrainsïŒ; è©äŸ¡ïŒ4.41±0.08ã
ã³ããªã³ã«ã€ããŠäœãèããããšããªãã®ã¯èª°ã§ããïŒ ãŸããééããªãç§ãã¡ã§ã¯ãããŸããã ãã¹ãŠã®ãã¥ãŒã¹ã¯ã³ããªã³ã§ãã£ã±ãã§ãã€ã³ã¿ãŒãããã¯æŽ»æ°ã¥ããŠããŸãããããŠããã®ãããžã§ã¯ãã®è²¬ä»»è
ã§ããAndrei Breslavãå
ã®äžã§ç§ãã¡ã«ãã£ãŠæ¥ãŸãã ã¢ã³ãã¬ã€ã¯ãèšèªãšãã©ãããã©ãŒã ã®å°æ¥ã«ã€ããŠå
·äœçã«èªã£ãŠããŸãã®ã§ã圌ã¯ééã£ãŠãããããããŸãããããã®ã¬ããŒãã¯ãããããã»ã©äŸ¡å€ã®ãããã®ã«ããŠããŸãã
ãŸããAndreiã補åã«ä»£ãã£ãŠå®éã«è©±ãããšãã§ããã®ã¯è峿·±ãããšã§ãã 圌ã¯åžå Žã§ããã«è©±ãããããšãã§ããŸãïŒKotlinã¯Scalaã§ããã°ããŒã¿ã®ããã«æŠããã©ãããPythonã§ããŒã¿ãµã€ãšã³ã¹ã®ããã«æŠããã©ããã æåã®ã¹ã©ã€ãã§ããç§ãã¡ã®ä¿¡æ¡ïŒJVMãJSãããã³ãã€ãã£ããã©ãããã©ãŒã åãã®ç£æ¥çšãã©ã°ããã£ãã¯èšèªïŒçžäºéçšãããŒã«ãå®å
šæ§ïŒã-ãšèšãããšã§ãã ãã®ã¹ã©ã€ãã§ã¯ãJVM以å€ã®ãã©ãããã©ãŒã ã®ãµããŒããçã®åªå
äºé
ã§ãããã©ããã®ãããã¯ã«é¢ãããã£ããã«ãŒã ã§ã®ãã£ã¹ã«ãã·ã§ã³ãçµäºã§ããŸãã
ããã«ãAndreiã¯ãã©ã®ããã°ã©ã ãã©ã®ãã©ãããã©ãŒã ã§ãå®è¡ã§ããããã«ããããšããŠããã®ã§ã¯ãªããšèª¬æããŸãã ãäžåºŠæžããŠãã©ãã§ãå®è¡ãã¯Javaçšã§ãããKotlinitesã¯ãããè¡ããŸããã ããã¯è²Žéãªã¢ã¶ã€ã¯äœåã§ãããããã§ã«Kotlinæåã®ã¢ãŒããã¯ãã£ãèšèšããŠãã人ã«ãšã£ãŠã¯è²Žéã§ãã ç§èŠãã¢ãŒããã¯ãã«ãšã£ãŠããã®ã¬ããŒãã¯ãããªããé£çµ¡ãã人ãšããªãã賌èªããããšããŠãããã®ã海岞ããçè§£ãå§ããããšãã§ãããšããç¹ã§éåžžã«è²Žéã§ãã

åãéšå±ã§ã次ã®ãããªäžå¿«ãªè³ªåãããããšãã§ããŸãïŒObjective-CãµããŒãããã€å
¥ãããKotlin Nativeã®ãœã±ããã®ãããªäŸ¿å©ãªã©ã€ãã©ãªãªã©ã 質åã¯äžäŸ¿ã§ãããAndreiã¯ã©ããããããåºãŠããŸãã:-)ãã€ãã£ãã«é¢ããŠå€ãã®è³ªåããããŸãããã¬ããŒãã¯çµã¿èŸŒã¿ã§ã®Kotlinã®äœ¿çšã«ã€ããŠçå£ã«è°è«ããŸããã Arduinoã§ã®Kotlinã«ã€ããŠã®è³ªåãšããŒãã³ã¹ãã®æœè±¡åãšããµãŒããŒãšããŠArduinoã«ã€ããŠæžãå Žåãå®éã«ã¯ãããããããšããè°è«ããããŸããã
äžè¬çã«ãã¬ããŒãã¯éââåžžã«å
·äœçã§ããã èšç»ãéæãæŠç¥ã«ã€ããŠã

æããã«ããã§ã«èªåã®æªæ¥ãã³ããªã³ãšçµã³ã€ããŠãã人ã«ãšã£ãŠãããã¯éåžžã«éèŠã§ãã ä»ã®çã®ããã«...ããŠãã¬ããŒãã®ç¹ã«ã売ããŠãããéšåã¯ãããŸããã§ãã-ãç§ãé£ã¹ãŠãããç§ã飲ãã§ãããç§ãè²·ã£ãŠããããã¯æ¬åœã«ç§ãè²·åããŸããã ç·ã¯éåžžã«å€ªããªã£ãŠããã®ã§ãé
ã
ãŸã§ãã³ãã¬ããã売ã£ããæ¯ã£ããããå¿
èŠãããããŸããã äžæ¹ãæåã«å°çã®ã³ããªã³ãããªãã®ããã«äœã§ããããçè§£ãããå Žå-ããã¯å€§ããããšã§ã¯ãªããããã€ãã®éæ¥çãªå
åã«ãã£ãŠæ±ºå®ããå¿
èŠããããŸãã
ç§ã«ãšã£ãŠããã®ã¬ããŒãã®äž»ãªå©ç¹ã¯ãæç€ºçã«è¡šçŸãããŠããªããã远跡å¯èœã§ãããšããã¢ã€ãã¢ã«ãããŸãããæªæ¥ã®ã³ããªã³ã¯ãçŸåšã®ã³ããªã³ã§ã¯ãããŸããã ä»ãäœããããããªããšã«ã€ããŠç§ãæ©ãŸããªããããã¯ããããå°æ¥ä¿®æ£ãããã§ãããã ç¹ã«ã人ã
ã¯ã¡ã¿ããã°ã©ãã³ã°ã®ãããªããšãçå£ã«èããŠããŸããããã¯ãç§ã«ãšã£ãŠãGolangã®å¹
åºãã¿ã¹ã¯ã®ãããã«ãŒã«ãªããŸããã ã³ã³ãã€ã©ãžã®ãã©ã°ã€ã³ãIDEã®ãã©ã°ã€ã³ã«èªåçã«ãªããGolangã³ãŒããžã§ãã¬ãŒã¿ãŒãå°å
¥ãããšãã«åã³èŠçã«ãªãã解決ããå¿
èŠããããšããã®ã¯éåžžã«äŸ¡å€ã®ããèãã§ãã èŠããã«ãKotlinã¯çŽ æŽãããæªæ¥ãäŒŽãæŠç¥ç決å®ãšã¿ãªãããšãã§ããŸãã
ã¹ããŒã«ãŒïŒNikita LipskyïŒExcelsiorïŒ; è©äŸ¡ïŒ4.42±0.07ã
ããããã¯ãNikitaãJVMã®æ§é ã«ã€ããŠç°¡åãªåŠçã¬ããŒããäœæãããããªãã®ã§ãã

åŠçã ãã§ãªããæçããçµéšè±å¯ãªéçºè
ããåºæ¬çãªç¥èã«ã®ã£ãããããããã€ãã³ãŒãæ€èšŒãã©ã®ããã«æ©èœããããçè§£ããŠããªãããšããããããŸããã
GCã®ãããªãã®ã¯ä»æ§ã§ã¯å¿
èŠã§ã¯ãªããååãšããŠã¬ããŒãžã³ã¬ã¯ã·ã§ã³ããªãã«ããããšãã§ããŸãïŒEpsilon GCã䜿çšãããªã©ïŒã 察ç
§çã«ããã€ãã³ãŒãã¯JVMSã§ããŒãã³ãŒãã£ã³ã°ãããŠãããVMã¯åããã€ãã³ãŒãã«åãçµæãè¿ãå¿
èŠããããŸãïŒæ£ãããã©ããã«é¢ä¿ãªãïŒã ãã®çµæãæ€èšŒè
ã¯äžåºŠæžãããåŸããããå¿ããŸãã ïŒåœé¢ã¯ãValue Typeãæ€èšŒè
ã®å€æŽãå¿
èŠãšããããšãç§ãã¡ã¯çç¥ã£ãŠããŸããïŒãããã£ãŠãæ€èšŒè
ãæžããããšã®ãã人ã¯äžçäžã«äœå人ãããŸããNikitaããã®äžäººã§ãã
ãã®ã¹ã©ã€ãã®ã¬ããŒãå
šäœã¯æ¬¡ã®ãšããã§ãã

ããªãäŒè°ã«åºåžããã®ãããšãã¡ã¢ãèŠãã®ã¯ãªããããšãã質åã«å¯ŸããŠãã€ã³ã¿ãŒãããã§ãããã®åé¡ã«ã€ããŠããã¹ã圢åŒã§éŠå°Ÿäžè²«ãã声æãåºãããšã¯å°é£ã§ãã
é¢çœãåç-å
éšããã¯ã©ã¹ãã¡ã€ã«ãé²èЧããäººã®æ°ã ã»ãŒããŒã«å
šäœã ããŒãããªã圌ãã¯ãããå¿
èŠãªã®ã§ããïŒ :-)æ£çŽã«èšããšãJVMã®åºæ¬ãæãäžããŠWebã¢ããªãã³ãŒãã£ã³ã°ããåã«ããã®ãããªè©³çްãåŠã³å§ããããšããèããŠããŸããã§ããïŒå®éã¯ããã§ã¯ãããŸããïŒã

æåã«ãNikitaã¯ãã¯ã©ã¹ãã¡ã€ã«ã®æ§é ããã€ãã³ãŒããããã³åœä»€ã®çš®é¡ãªã©ã«ã€ããŠè©³ãã説æããŸãã
ãåäžé·è
ã«ãªãããããšããã²ãŒã ããããŸããã ã®ã«ããã®ããã« ãããã³ããŸããŸãªè峿·±ãäŸã

次ã«ãNikitaãšãšãã«ãJVMã®5çªç®ã®ç« ããJVMã«ã¯ã©ã¹ãããŒãããæ®µéïŒããŒãããªã³ã¯ãåæåïŒãå®è¡ããŸãã æ€èšŒã¯ããªã³ã¯ãã§ãŒãºã®æåã®æ®µéã§ãã ãã®åŸãæ€èšŒã®è©³çްã«é²ã¿ãŸããéçå¶çŽãšæ§é çå¶çŽã®ãã§ãã¯ã§ãã éçãã§ãã¯ã¯2ã€ã®ãã¹ã§è¡ãããŸããåºåã¯ã¡ãœãããã€ãã³ãŒãã®å¶åŸ¡ãããŒã°ã©ãã§ããæ§é å¶çŽã¯ãããšãã°ãååœä»€ã®ã¹ã¿ãã¯ã®æ·±ããå®è¡ãã¹ã«å¯ŸããŠç¹å®ã®å€ã§ãªããã°ãªããªããªã©ãããè€éãªããšããã§ãã¯ããŸãã
æ€èšŒè
ã®éæ³ã¯éçã¹ããªãŒã è§£æã§æ©èœããŸããããã¯ç ç©¶æã§ããã°ã©ãã³ã°çè«ãŸãã¯ããã°ã©ã åè·¯çè«ã«ãã£ãŠèª¬æãããããšããããŸãã ãããŒã¿ããã®éšåãå
¬éããã®ã¯ã©ããããããè€éãããããšã¯ããã«æããã«ãªããŸãã-ãããŠã圌ã¯ã¹ããªãŒã åæã«é¢ããè¬çŸ©ãè¡ã£ãŠããããšãããããŸãã ã©ããããããããã®å Žæã§ã®äŒè°ã®ããã°ã©ã å§å¡äŒãéããŠãææãªã©ã®åæ Œåã«ã€ããŠææãæŒããŸããã

ãã ãããã®ãã¹ãŠã®èŠçŽ ã¯ãã¹ã¿ãã¯ããããã¬ãŒã ãç¹å®ã®ãã€ãã³ãŒããªã©ããžã£ãã¹ã¿ã«éŠŽæã¿ã®ãããã®ã«ç°¡åã«åœãŠã¯ãŸããŸãã ããã«ã€ããŠã¯ãããããã®è¯ãã€ã©ã¹ãããããŸãã ããã«ãæ€èšŒã¿ã¹ã¯ã®ãªã¢ã«ã¿ã€ã ãããã³Java 5ã§å®è¡ãããåŠçãèšç®ããããšãã§ããŸãããã®åŸãå€ãã®ç°ãªãçŽç²ã«å®çšçãªäºé
ã«ã€ããŠèª¬æããŸãã
å人çã«ã¯ããã®ã¬ããŒãã¯ããã€ãã³ãŒãæ€èšŒïŒ java -jar -Xverify:none MyApp
ïŒãç¡å¹ã«ããæšå¥šäºé
ãçŽç²ãªçæ°ã§ãããæ€èšŒè
ã«å¯Ÿããæ¹å€ãæ±ãã¹ãã§ããçç±ã«ã€ããŠïŒçè«ãšå®è·µã®äž¡æ¹ã®èгç¹ããïŒç¢ºåºããæ£åœåãäžããŸããæçè«ã®å€§éšåã ããã«ã ASMãªã©ã®ã©ã€ãã©ãªã䜿çšããå Žåã«éåžžã«åœ¹ç«ã¡ãŸãïŒã¬ããŒãã®éäžã§ASMã®äœ¿çšã«é¢ããæšå¥šäºé
ã瀺ããŸãïŒã
ã¹ããŒã«ãŒïŒããªã«ã»ãã«ã«ãã§ãïŒã¢ã«ãã¡ç ç©¶æïŒããã³ãšãã²ããŒã»ããªãœãïŒãã€ã»ãã¯ãããžãŒãºïŒã è©äŸ¡ïŒ4.45±0.05ã
ããã¯çŽç²ã«å®çšçãªã¬ããŒãã§ããããã€ã¯ããµãŒãã¹ã®äžéšããã¹ãããã¬ããŒãã§èª¬æãããŠããããŸããŸãªååãé©çšããæ¹æ³ã瀺ããŸãã
ããã¯ãRESTãšãã¥ãŒãåããæšæºã¢ãŒããã¯ãã£ã䜿çšããSpringã§äœæããããã£ããã®ã©ã€ããã¢ãªã©ãWebéçºè
ã®å¿ã«è¿ããã®ãè±å¯ã«ãããšããç¹ã§ãJVMããã€ã¹ã«é¢ãã以åã®ã¬ããŒããšã¯å€§ããç°ãªããŸãã ãããã¯ã®åé¡ã¯ãçŽ æ©ãã¢ãããŒãã䜿çšãããšããã«ããã¯ã¢ããã§ãããã®ãšãã©ãã©ã«ãªããã®ã®ãããã¯ã§æ€èšãããŸãã
ç°¡åãªãããŒãªã³ã°ã®è¡çºãšããŠãã¹ããŒã«ãŒã¯ä»»æã®WebãµãŒãã¹ã§ã¯ãªããBaruch SadogurskyïŒ @jbaruch ïŒãšYegor BugaenkoïŒ @ yegor256 ïŒã®é è³ããã¹ãããŠããŸãã ã¿ã¹ã¯ã®æ¡ä»¶ã«å¿ããŠãBaruchã®åçã¯ãã£ãã·ã¥ãããYegorã¯æéã®çµéãšãšãã«æ°ãå€ããå¯èœæ§ããããåçããåã«èããŸãïŒãã¥ãŒã䜿çšããŠããŒã¿ãåä¿¡ããŸãïŒã

ãã®ã¬ããŒãã«ã€ããŠæžãããšã¯ããŸãæå³ããããŸãã-ããªãã¯ãã ãããèŠãªããã°ãªããŸããã è¬æŒè
ãã¡ã¯ãSpringã§ã®ãã¹ãã®åºæ¬ããçãçããšè峿·±ã圢ã§ç€ºããŠããŸã-ããã€ãã®ä¹Ÿç¥ããäºå®ã ãã§ãªãããŒãããå®çšçãªã¢ããªã±ãŒã·ã§ã³ãŸã§ã®éçºã æåã¯å€ãã®ããšãæå³çã«èª€ã£ãŠè¡ããããã®åŸãé²åçãªæ¹æ³ã§çæ³ã«ãŸã§éããŠããã®ã¯è峿·±ãããšã§ãã
次åSpringãšSpring Bootã§ãããžã§ã¯ããè¡ãå¿
èŠããããšãã«ããã®ã¬ããŒããå¿
ã確èªããŸãã ãã¹ãã®åé¢ãç¶æããããã«@SpringBootTest
å¿
èŠãªçç±ïŒã³ã³ããã¹ãå
šäœã®ãã¹ããããããã£ã®å€æŽãç¹å®ã®é
åã§ã®ãã¹ãã®äœæ-ããã±ãŒãž/æ§æ/èªåã¹ãã£ã³ïŒã@TestConfiguration
ã«ãªã@SpringBootConfiguration
- @SpringBootTest
ã·ã°ããªã³ã°ã«ã®ã¿@SpringBootConfiguration
å¿
èŠã§ãåœŒã¯æ¢ããªããã°ãªããŸããã äžè¬ã«ãSpringã䜿çšãããã¹ãã¯è¿
éã«å®è¡ã§ããããšãæããã«ãªããŸãããããã£ãã·ã¥ã¯ç°¡åã«ç Žæããããã @TestConfiguration
ã¯@TestConfiguration
ã®ã¿ã䜿çšããå¿
èŠããã@TestConfiguration
ã
ç§ã¯ç¹°ãè¿ããŸããããã®ã¬ããŒãã§ã¯ãéçºããã»ã¹èªäœãšãã®é²åã®çè§£ããç¹å®ã®çµè«ã®æçµãªã¹ããããéèŠã§ãã ãã¡ãããèªåã§åãçµè«ã«éããããšãã§ããŸãããèšå€§ãªæéãç¡é§ã«å€±ããŸãã
ã¹ããŒã«ãŒïŒEvgeny BorisovïŒNaya TechnologiesïŒ; è©äŸ¡ïŒ4.46±0.05ã
Zhenya Borisovã«ããå¥ã®ã¬ããŒããããã¯ããããã®ãCurse of Spring Testãã«ãã§ã«ååšãããã®ãå®å
šã«è£å®ããŸãã
ã¬ããŒãã®çµè«ã¯ãæåã®ã¹ã©ã€ãã§çªç¶äžããããŠããã®ã§ãããããèŠãŠãããŸãããã
- æ¥ã¯å®ç§ã§ã¯ãããŸãããããã以äžã®ãã®ã¯ãããŸããã ãããŠã圌ã¯ãŸã ååã§ãã®ã§ãç§ãã¡ã¯åœŒãæããŠããŸãã
- Springã§ã¯ããã©ãããã©ãŒã ãæ§ç¯ã§ããŸãã
- ãããä¿®çããããšãæããŠã¯ãããŸããããããèªäœãä¿®çããããšãå¿ããªãã§ãã ããã
- æŽæ°ã«é¢ãã仿§ããèªã¿ãã ããã
ãŠãŒãžãŒã³ã¯ãæåãªã¹ã©ã€ãããã¬ããŒããéå§ããŸãã

ããã¯ããªãéçºè
ãšã©ã€ãã§ãã£ããããäŒè°ã«è¡ããææ°ã®èšé²ãèŠãå¿
èŠãããã®ãââãšããåé¡ã§ãã ç§ã¯èªåèªèº«ã®èŸãé¢ã§ãžã§ã³ã€ã®ãã®èгå¯ãæããŸããïŒæ¥ã«ã€ããŠã®å£°æã®éèŠãªéšåã¯åã§ããããçµ¶æçã«æä»£é
ãã§ãã
ããšãã°ãèªå·±æ³šå
¥ã®ã¢ã€ãã¢ã ãã©ã³ã¶ã¯ã·ã§ã³æ§ã䜿çšããå Žåãç¬èªã®ã¡ãœãããåŒã³åºãBeanã¯this
䜿çšããã®ã§ã¯ãªããèªèº«ãžã®ãããã·ã䜿çšããå¿
èŠããããŸãã ãããè¡ãã«ã¯ãèªåèªèº«ïŒãŸãã¯èªåèªèº«ã§ã¯ãªããèªåã®ãããã·ïŒã泚å
¥ããå¿
èŠããããŸãã ãã®ç¶æ³ã¯ã©ãããæ¥ãã®ã-Zhenyaã¯è©³çްã«èª¬æããŸãã ããã¯Spring 4.3ãŸã§ã¯æ©èœããŸããã§ãããã @Resource
ã¢ãããŒã·ã§ã³ã䜿çšã§ããŸããããæã«ã¯æ©èœããXMLã§ãåžžã«æ©èœããŠããŸããã Spring 4.3以éã @Autowired
ãš@Inject
ã¯æ©èœãå§ããŸããããæšæºã®Javaæ§æã¯æ©èœããŸããïŒJavaã®ã»ãã³ãã£ã¯ã¹ã§ã¯ãã®ãããªåä»ãªããšã¯èš±å¯ãããŸããïŒã ãããŠãããã«ã¯ãã¹ãŠãSpringãã©ãã«ãŒã§ã®ãã°ã®äœæãã4幎åããããŸããã
次ã®äŸã¯ãç Žå£ãããPropertySourcesPlaceholderConfigurer
ã§ãã ãã®ããšïŒæ£ç¢ºã«ã¯ããã®ã«ã¹ã¿ã å®è£
ïŒãã©ãã ãç§ããè¡ã飲ãã ã®ãã Eugeneã¯ãããŒãžã§ã³4.2ã§ã¯javakonfigã§static
ãšããŠæå®ããå¿
èŠãããïŒããã§ãªãå Žåã¯ãã¹ãŠãšã©ãŒãçºçããïŒãæè¿ã®ããŒãžã§ã³ã§ã¯@PropertySource
ã®ã¿ãæå®ã§ããããSpring Bootã®å Žåã¯ãŸã£ããæå®ã§ããªããš@PropertySource
ãŸãã ãããã®éã«ã¯æ°å¹ŽããããŸãã
ã¡ãªã¿ã«ãäŸã¯ãããŒã ã«ãã£ãŠå©çšãããŠããŸãã ããšãã°ããã³éã®åŸªç°äŸåé¢ä¿ã¯ã劻ãèªåã«æ³šå
¥ãã倫ã®äŸã«ãã£ãŠç€ºãããŠããŸãã

ãããã®äŸãããããžãã¯ã@PostConstruct
ã§ããžãã¹ããžãã¯ã®éå§ããããã¯ããã®ã¯æªããšããèãã«@PostConstruct
ãŸããã æ£çŽãªãšããããã®ãããªã¢ã€ãã¢ã¯ç§ã®é ããããããšãããããŸããã§ããïŒãŸããããã¯ç§ãçã®ã³ãŒããŒã ããã§ãïŒãçµå±ã®ãšãããããããã¹ãŠã®åé¡ã¯æ
éã«éžæãããæŸèæã«ãã£ãŠè§£æ±ºãããŸãã @Main
ã¯ããã®ãããªæŸèæãæ£ããæžãæ¹æ³ãæããŸã-èªäœã®@Main
ã¢ãããŒã·ã§ã³ã¯ããããæç¢ºã«ããŸãã
倧ãŸãã«èšã£ãŠãeventListenerãäœæãããŸãïŒã¡ãœããã®äžã®æ°ããã³ã³ããŒãã³ãã¯@EventListener
ã¢ãããŒã·ã§ã³ã§ããããã©ã¡ãŒã¿ãŒã§ã¯ãã©ã®ã€ãã³ãããã£ãããããïŒã ContextRefreshedEvent
ãå¿
èŠContextRefreshedEvent
ã æ¬¡ã«ãBeanDefinitionsã調ã¹ã @Main
èŠã€ããŠãã«ããå¿
èŠããããŸãã ããããåæã«ãããããã¹ãŠãSpring Bootã§åäœãããã«ã¯ãç¹å®ã®æäœãå®è¡ããå¿
èŠããããŸãã ããã§ã¯ãèå³ã®ãã人ãã¹ãŠã«ã€ããŠã¯èª¬æããŸãããã¬ããŒããã芧ãã ããã ããã«ãSpringã«æ²¡é ããŠããªã人ã«ãšã£ãŠã¯ã80æåãè¶
ããååãæã€ã¡ãœããã®ãã®éæ³ã¯ãããçš®ã®ã²ãŒã ã®ããã«æããŸãã ãã ãããã®ã¬ããŒãã§ã¯ãMavenã«äŸåé¢ä¿ã远å ããã ãã§ãã®ã²ãŒã ããã¹ãŠèªåçã«æ¥ç¶ããæ¹æ³ã瀺ããŠãããããæ¯åãã®å°çã«è¡ãå¿
èŠã¯ãããŸããã
ãããŠãããå€ãã®è峿·±ãããããŠæã«ã¯å®å
šã«çŠæ¢ãBeanFactoryPostProcessor
ãŠããããšã¯ã BeanFactoryPostProcessor
ãšSpringããŒãžã§ã³ã®BeanFactoryPostProcessor
ãŸãã ç§ã¯ãZhenyaã«ã€ããŠååã«èããŠãããããã¹ãŠééã£ãŠé©çšãã人ã
ããããšç¢ºä¿¡ããŠããŸãã
äžè¬ã«ããã®ã¬ããŒãã«ãããSpringãSpring Bootã®ä»çµã¿ããããŠæãéèŠãªããšãšããŠãjavadocãèªãã ãã§ã¯çè§£ã§ããªãã€ããªãã®ãŒã®ãã¥ã¢ã³ã¹ãããããçè§£ã§ããŸãã ããã§ã¯ãçµéšè±å¯ãªSpring Jediã®ä»å
¥ãšã¢ããã€ã¹ãå¿
èŠã§ããããã¯Zhenyaã§ãã ãã®ã¬ããŒãïŒããã³Zhenyaã®ãã®ä»ã®ã¬ããŒãïŒã¯ãæšæºæ©èœã倱ããå§ããŠãããããããã«ç¢ºèªããå¿
èŠãããã BeanPostProcessor
ããã³BeanFactoryPostProcessor
ããã«BeanPostProcessor
ãããšèããŠããŸãã
ã¹ããŒã«ãŒïŒSergey KuksenkoïŒOracleïŒ; è©äŸ¡ïŒ4.47±0.06ã
ãããã誰ããæ¢ã«ç¥ã£ãŠããããã«ãHTTP / 2å¥åRFC 7540ã¯ãå€ããã¥ãŒãHTTP / 1.1ã眮ãæããããã«Googleã®ç޳士ãŸãã¯ä»ã®èª°ãã«ãã£ãŠçºæããããããã³ã«ã§ãã
åŸç¶ã®ç©èªã®äž»ãªåœ¹å²ã¯ã/ 1.1ãã/ 2ã®ããã€ãã®éãã«ãã£ãŠæããããŸãã
- ãã€ããªåœ¢åŒïŒãã¬ãŒã ã䜿çšïŒ
- åäžã®TCPæ¥ç¶ã§è€æ°ã®èŠæ±ãå€éåãã
<Request> => <Stream> => <Frame> ... <Frame>
- ããããŒå§çž®ïŒHPACKå¥åRFC 7541 ïŒ
åºæ¬çã«ãHTTP / 2ã¯ã以åã®æšæºã®ç¹å®ã®åé¡ã解決ããéåžžã«äœããããã³ã°ã§ãã
äžæ¹ãOpenJDKã«ã¯ãJDK 110ã®äžéšãšããŠãªãªãŒã¹ããããããŸã Java SEã®äžéšã«ãªã£ãŠããªããHTTPã¯ã©ã€ã¢ã³ããã§ããJEP 110ããããŸãã 圌ã¯ç£èŠãããè°è«ãããã®ã«ååãªã»ã©éæŸãããã ããªããæåŸ
ãããããªãã®ã«èŠããŸãïŒURLãæã€ã³ã³ã¹ãã©ã¯ã¿ãŒãåæããã³éåæAPIãªã©ã ã¯ã©ã€ã¢ã³ãã¯ãŠãããŒãµã«ã§ãããHTTP / 1.1ãšc / 2ã®äž¡æ¹ã§åäœããŸãã

ã¹ããŒã«ãŒãšã¯ããã®ã¯ã©ã€ã¢ã³ãã§ããã©ãŒãã³ã¹ã®ä»äºã«æºãã£ã人ã®ããšã§ãåŸã§åœŒã«ã€ããŠè©±ããŸãã ç®æšã¯ãåççãªæéå
ã«é©åºŠã«éãã¯ã©ã€ã¢ã³ããç²åŸããããšã§ãã
æåã«ã圌ã¯ããããã³ãããŒã¯ããŸããããããããã¯ã©ã€ã¢ã³ãã«ãããŸã倿ŽããªãããšãæåŸ
ããŠã ç«¶åä»ç€ŸãšããŠãJettyã¯ã©ã€ã¢ã³ããæ¯èŒã«äœ¿çšãããŸããã

ã©ããããããããã¯æ²ããããšã«å€æããŸããã ãã®å Žåã誰ãããããèŠããŠããå Žåã TCP_NODELAY
æ¢ç¥ã®åé¡ããããŸããã 人ã
ã¯æã
ãç¹ã«ããç¥ãããŠããæšªæ£ãåã«å¿ããŸãã ããã«ãããããããã»ã«ã²ã€ã¯ãããã®ãã¹ãŠãäœããã®ç§å¯ã®ç¥èã§ã¯ãªããå
žåçãªåŠæ ¡ã¯éåžžã«ç°¡åã«ã°ãŒã°ã«ã§ãããåå¿è
ã«ãã£ãŠå匷ããããšäž»åŒµããŠããŸãã
ãããå®éã®ããã©ãŒãã³ã¹ã¹ãã·ã£ãªã¹ãã®é ã®äžã§ã©ã®ããã«æ©èœããã®ã ãããã äžéšã®ã¢ããã¥ã¢ã§ã¯ãªããæ¬åœã®ã¢ããã¥ã¢ã§ãã åœŒã¯æåŸã®ç¬éãŸã§ãããã³ã«ã®ä»æ§ãèªã¿ãŸããã§ããã 圌ã¯ãããã¡ã€ã«ãäœæããããã©ãŒãã³ã¹ãã¹ããäœæãããããã¡ã€ã©ãŒã€ã³ã¿ãŒãã§ãŒã¹ã調ã¹ãŸããããå€ãã®ãªãœãŒã¹ãæ¶è²»ãããã¡ãã颿°ãååšããããšã倿ããæåŸã®ç¬éã«ã®ã¿ä»æ§ãèªã¿äžããŸãããããã®ååããã¯ããããäœãããŠããã®ãæç¢ºã§ã¯ãããŸããã ã€ãŸããåå°ã¯ãåžžã«ä»æ§ãæåã«èªãããã®ã§ãããããããæãæ£ãããã®ã§ã¯ãããŸããã
äžæ¹ã仿§ãèªãã§ããã®ã§ãããããæ³šææ·±ãèªãã§ãããã«çµã¿èŸŒãŸããããã¯ã䜿çšããŠãã ããã å¿
èŠãªããã¯ã䜿çšããåŸãã¯ã©ã€ã¢ã³ãã¯Jettyã远ãè¶ãå§ããŸãã-ãããçåœãäžãã仿§ã®åŒ·ã¿ã§ãã
ã¬ããŒãã§ã¯ãããããã¹ãŠããHTTPã¯ã©ã€ã¢ã³ããäœæãããµããžã§ã¯ãé åããã®å®éã®ããŒã¿ã§ç€ºãããŠããŸãã ããšãã°ãåã®ä»æ§äŸã¯ãHTTP / 2ã§ãŠã£ã³ããŠãå±éããæé ã«ãã£ãŠç€ºãããŸããã ãããããèŽè¡ã®äžéšã«ãšã£ãŠããã®è³ªåã¯ããèªäœã«é¢é£ããããããã«ãããããã®ãããã¹ãŠã®äŸã¯æ¬åœã«æçšã§ãã ç§ã«ãšã£ãŠãæ£çŽãªãšãããããŸãè¯ããããŸããã§ãããWebãã€ã³ãŒãã£ã³ã°ã®æ¥ã
ã®å®è·µã§ã¯ãéåžžããã®ãããªã©ã€ãã©ãªãäžåºŠã ããã¹ãŒããŒãããã§ãã·ã§ãã«ã«ãã£ãŠæžããããã®ã䜿çšããŸãã
ããã«ãé¢çœãã©ã€ãããã¯ã®ã»ããããããŸãã ããã©ãŒãã³ã¹ã¢ãŒãã£ã¹ããããã·ã§ã³ã³ã³ãããŒã«ã«1æ¥äžåº§ã£ãŠãããã«åºã¥ããŠããçš®ã®é»éè¡ãè¡ããšããç¥è©±ããããŸãã Sergeyã®å®è·µã§ã¯ãã»ãšãã©ã®å Žåããã°ããã¡ã€ã«ã«èšé²ããæ¬¡ã®ãããªå³èã®æ¹æ³ã§ãããã確èªããŸãã


ãã®çŽåŸããããã¯ãŒã¯ã©ã€ãã©ãªã§ãã¯ã€ãã¯ãã¥ãŒã®ã°ããŒãã«ããã¯ã®äžã«å€ªåã®ã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããæ¹æ³ãæç¢ºã«ç€ºãããŠããŸãã ããã¯ã¯æªã§ãããåçŽãªãªãã¡ã¯ã¿ãªã³ã°ã§å€ããçµãåºãããšãã§ããŸãã
䞊è¡ããŠãç¥è©±ã¯ãGCããããŒã«ãžã®ç§»è¡ãèªåçã«è¯ãçµæãããããããšãæŽããŠããŸããå®éã«ã¯ãããŒã«ããäœãåŸãããªãç¶æ³ã«é¥ãããšã¯ãããŸãããããŒã«ãªãã§äœæ¥ãããã¹ãŠã®äžå©ãªç¹ããããŸãã

ãŸã ããããã®è峿·±ãããšããããŸãããããã©ãã¹ããã¹ã¯ãªãŒã³ã·ã§ããã®å·šå€§ãªã³ã¬ã¯ã·ã§ã³ã«å€ããããšã¯ã§ããŸããïŒå¿
èŠãªå Žåã§ãïŒã
äžè¬çã«ããã®ã¬ããŒãã¯ããããã¯ãŒã¯ã§äœæ¥ããŠããããã©ãŒãã³ã¹ãšã³ãžãã¢ã®ããäŒããèãæ¹ã®æèŠãæ®ããŸãã ãŸããããŸããšããŠãHTTPã¯ã©ã€ã¢ã³ããéçºããå
žåçãªã¬ãŒããé ã远ã£ãŠèª¬æããŸãã
ã¹ããŒã«ãŒïŒSasha GoldshteinïŒSela GroupïŒ; è©äŸ¡ïŒ4.49±0.07ã
ããã§ãæåã®3ã€ã«é²ã¿ãŸãã ãã®ã¬ããŒãã¯ç¹ã«çè§£ãã«ãããã®ã§ããã å®éããã®èšäºãæžãããã«ããã¹ãŠã®èšé²ãåéã§ã¬ãã¥ãŒããŸããã ãµãŒã·ã£èªèº«ã¯æ®éã®äººãããéã話ããããã«ã¬ããŒãå
šäœã¯è±èªã§ãã ãã®çµã¿åããã¯æ¬åœã«è³ãåãå»ãã®ã§ãåããŠãããèããŠãããªããæšæºé床ããªã³ã«ããå¿
èŠããããŸãã
èŠããã«ãC ++ãŸãã¯Pythonã§ã¢ããªã±ãŒã·ã§ã³ãç£èŠããããã«é垞䜿çšãããSashaãç¬ãé£ã¹ããœãããŠã§ã¢ã¯ãJVMã¢ããªã±ãŒã·ã§ã³ãç£èŠããããã«ãéåžžã«äœ¿çšã§ãããšããããšã§ãã ãã¡ãããããã¯ãã¹ãŠLinuxäžã§è¡ãããŸãã
ã¬ããŒãã®ã°ããŒãã«ãªç®çã¯æ¬¡ã®ãšããã§ãã

ãã®ç¹ã§ãBPFãšããèšèã¯ããã«æããã«ãªããŸãããå€ãã®äººã¯çã£ãŠããŸããã ååãšããŠãã€ã³ã¿ãŒãããäžã§åæ§ã®ãããã¯ã«é¢ããä»ã®ã¬ããŒããèŠã€ããããšãã§ããŸãããJavaã«é¢ãããã®ã¯ãããŸããã
ãã®ãã°ãããã¬ããŒãå
šäœãå°ç¡ãã«ããããšã¯ããŸããããå°ããªçš®ã®è©±ããå§ããŸãããã
ã¬ããŒãã¯ãä»ã®ç£èŠããŒã«ã®éçºç¶æ³ãèæ
®ã«å
¥ããè°è«ããå§ãŸããŸãïŒãã¹ãŠã®ããŒã«ã¯ãæ°ãããå®å®ãããããã³æ©èœåæ¢ã«åé¡ãããŸãïŒã ããšãã°ã ftrace
ã perf
ã SystemTap
ãªã©ã®å®å®ãããã®ïŒæ¬çªã¢ãžã¥ãŒã«ãå«ãã«ãŒãã«ã¢ãžã¥ãŒã«ã®ã³ã³ãã€ã«ãšåçãªããŒããå¿
èŠã§ãïŒã æ°ãããã®ããããŸãïŒ SysDig
ïŒéåžžã«ã·ã³ãã«ã§ãããæ©èœã¯ã»ãšãã©ãããŸããïŒãç°ãªãèšèªã®ãã€ã³ããŒã䜿çšããBPF
ã dtrace for Linux
ã ktap
ã LTTng
ãªã©ã®dtrace for Linux
ãªã©ãä»ã«ãå€ãã®dtrace for Linux
ããããŸãã
ããã«ãJVMã«ã€ããŠåŠç¿ã§ããããšã確èªããŸãã JVMã«ã¯ããªã³ã«ããŠå€éšãœãããŠã§ã¢ã䜿çšããŠæ¥ç¶ã§ããç¹å¥ãªãã¬ãŒãã£ã³ã°ãã€ã³ããããããšãããããŸãã

ããã«ãSashaã¯tplist tplist
ãããã¯tplist -p `pidof java`
ãšããŠtplist -p `pidof java`
ããšãã§ããŸãtplist -p `pidof java`
ããã¯ãã¹ãŠãã©ãããªã¹ãã«è¡šç€ºããããããç®ã§èªãå¿
èŠã¯ãããŸããã
è峿·±ãããšã«ããããã®ãã¹ãŠã®ãã€ã³ãã«ã¯ãã©ã¡ãŒã¿ãŒãããããã monitor__waited
ãã¢ãã¿ãŒãããšã4ã€ã®ãã£ãŒã«ãïŒç¬Šå·ä»ãã笊å·ãªãã笊å·ãªãã笊å·ä»ãïŒã®æ§é ãèŠã€ãããŸãã æ®å¿µãªãããå€ã®çš®é¡ã«å ããŠããã©ã¡ãŒã¿ãŒã«ã€ããŠã¯äœãç¥ããŸããã ãã ããæã䟿å©ãªåœ¢åŒã§ã¯ãããŸãããã .stp
ãã¡ã€ã«ã§æ
å ±ãéãããšã¯ã§ããŸãã å°ãªããšããããããåŒæ°åãåŒãåºãããšãã§ããŸãã
ããã«ã BPF
ã«é²ãããã«ãSashaã¯prodã§ãããã°ããå¿
èŠãããã¢ããªã±ãŒã·ã§ã³ã®äŸãæäŸããŸããç°ç«¯ãã©ã®ã³ãŒããã³ã³ãœãŒã«ã«åºåããããçè§£ããããã«ããããã¬ãŒãžã®æ¥ç¶ãèš±å¯ãããŠããªãå Žåã ã¿ã¹ã¯ã¯ã²ã©ãã§ããéåžžã®ç®¡çè
ã¯ææã§åœŒå¥³ããéããŸãã -XX:PreserveFramePointer
ïŒ3ïŒ
ã®ãªãŒããŒããããäžããïŒã«æ¥ç¶ããå¿
èŠãããããã®åŸBCC
ã®trace
ãŠãŒãã£ãªãã£BCC
ãŸãã
trace `SyS_write (arg1==1)` "%s", arg2' -U -p `pidof java`
ãã¬ãŒã¹ã¯å¿
ãã«ãŒãã®äžã§å®è¡ãããŸãã æ¬¡ã«ããã¬ãŒã¹ïŒãã®å ŽåSyS_write
æžã蟌ã¿çšsiskolïŒãæ¡ä»¶ïŒ (arg1==1)
ïŒãåºåçšã¡ãã»ãŒãžïŒ "%s", arg2
ïŒã-U-ãŠãŒã¶ãŒã¹ããŒã¹åŒã³åºãã¹ã¿ãã¯ã ããããŠãã¡ããPIDã§ãã£ã«ã¿ãŒããŸãã ã©ããããããæ¬¡ã®ããã«ãªããŸãã

次ã«ã以åã«äœæããã¹ã¯ãªããïŒ perf-map-agent
create-java-perf-map
ïŒã䜿çšããŠãã¡ãœããã¢ãã¬ã¹ãJavaã®å®éã®ã¡ãœããåã«å€æããŸãã
ãã®åŸãç§ãã¡ã®ããŒã ã®ç²ããæãäžããå¿
èŠããããŸãã å¿
èŠãªè¡ã衚瀺ããç¹å®ã®å ŽæãååŸããŸããã
ããªãã¯ããªãã®è£œåã«ãã®ãããªçŠç¹ãçµãããšãã§ããŸãïŒãã®ãããªãã¥ãŒãã³ã°ã«æ
£ããŠããªãå¹³åçãªäººã¯ãããéæ³ãšèŠãªããäœã§ãä¿¡ããããšãã§ããŸãã æ¬¡åã¯ã圌ã®èããèªãã§æ»è
ããã¿ãããããããšãã§ããããšã管çè
ã«äŒããããšãã§ããŸãã
ãã®ã¬ããŒãã«ã¯ã BCC
ãŠãŒãã£ãªãã£ãªã©ãé«åºŠãªãã¥ãŒãã³ã°ã䜿çšããããšã§å®éã«èª¬æãããŠããçŽ æŽããããã®ãæºèŒãããŠããŸãã
Javaã¢ããªã±ãŒã·ã§ã³ã¯System.gcïŒïŒã§ã¬ããŒãžãé »ç¹ã«åéããŸããããã®çç±ãç¥ãããã§ããïŒ ã¯ãã -XX:PreserveFramePointer
ãé€ãã -XX:PreserveFramePointer
-XX:+ExtendedDTraceProbes
æå¹ã«ãã-XX:PreserveFramePointer
ãããŸããããã¯éåžžã«é«äŸ¡ãªãªãã·ã§ã³ã§ãããäžå®ã«ä¿ã€ããšã¯ã§ããŸããã 管çè
ã«é »ç¹ã«ãªã³ãšãªããåãæ¿ããããäŸé Œããå Žåã圌ã¯ããªããæ¬åœã®ãã¯ããã³ãµãŒã§ã¯ãªãããšãæšæž¬ã§ããŸãïŒå®éãããªãã¯ãã£ãšæªãã§ã-ããªãã¯ä»ã圌ã®è³ãäœãã€ãã¹ãã§ãïŒã ããŠããã®åŸããµãŒã·ã£ãèªãå°çã®ååŒãå®è¡ããŠãã ããïŒ method__entry
èªåèªèº«ãmethod__entry
å¿
èŠããããŸãã
ããã«ããµãŒã·ã£ã¯ããªãperf
æªãã®ãïŒãã¿ãã¬ïŒãŠãŒã¶ãŒç©ºéã§åæããããã«ããŒã¿ã倧éã«ããã·ã¥ããïŒããã³ããããçš®é¡ã®ãã®ã«ã€ããŠèª¬æããŸãã
GNU / Linuxãã©ãããã©ãŒã ã§ã®Javaã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«é¢äžããŠãããã¹ãŠã®äººã«ããã®ã¬ããŒããèããŠçµè«ãåºãããšã匷ããå§ãããŸãã ããã¯çµ¶å¯Ÿå¿
èŠã§ãã
ã¹ããŒã«ãŒïŒãã³ã©ã€ã¢ãªã¡ã³ã³ãïŒEPAMïŒ; è©äŸ¡ïŒ4.51±0.04ã
Hibernateã2äœã®ã¬ããŒãã®ãããã§èŠãªããã°ãªããªãããšã¯ãã·ã§ãã¯ã§ã¯ãªãã«ããŠããé©ãã§ããããšã倿ããŸããã Hibernateã¯ãã®ãããªãã®ã§ã 2001幎ã«ãªãªãŒã¹ãããŸãã ã ããæ°å¹Žã圌ã«ã€ããŠã§ããããšã¯ãã¹ãŠèªãããŠããŸãããïŒ ãããèã人ã¯ãŸã ããŸããïŒ
æ³ãŸã£ãã ãããããããæ¬åœã«è¯ãå ±åã§ããããã³ã©ã€ã»ã¢ãªã¡ã³ã³ããHibernateã®å€æ§æ§ãçè§£ããŠãããŸãã«ãã®äººã§ããå Žåã«ã®ã¿ã 5幎ã®éã«ã圌ã¯ãWhy I hate HibernateãããââBarefoot on the Hibernate rakeããªã©ã®ç¥èãªã¿ã€ãã«ã§ã¬ããŒããæäŸããŠããŸããããªã¹ãã¯é·ããäžéšã¯YouTubeã§èŠãããšãã§ããŸãã
ã¿ã€ãã«ã§è¡šæãããåé¡ã¯æ¬åœã«ç§ã«è¿ããšèšãããã§ãã 人ã
ã¯Hibernateã誀ã£ãŠäœ¿çšããé ã䜿ã£ãŠèããããšãæåŠããã¹ããŒããªæ¬ãèªãŸãªãã§ããHibernateã¯é
ãããšå«ã³ãŸãã äžæ¹ã§ã¯ãããã¯ãã®ãããªäžå¿«ãªæèŠãåãã¿ãšè»œsnã®between蟱ã®äº€å·®ãåŒãèµ·ãããŸãã äžæ¹ãã·ã¹ãã ã«ãã»ãšãã©ã®ãŠãŒã¶ãŒãã»ãŒ17幎é䜿ãããªãããšãã§ããªããããªAPIãããå Žåããã®ãããªAPIã«ã¯æããã«åé¡ããããŸãã
æåã®ã¹ã©ã€ãã®ãã³ã©ã€ã¯ãããã圌ã®å人çãªçµéšã«ãããªããšãããããã¯ã«é¢ããå
責äºé
ãäœæããŸãã ãããããã®å Žåãç§ãã¡ã®çµéšã¯ãŸã£ããåãã§ãã

ã¬ããŒãã¯ãHibernateãšã¯äœããããã解決ããåé¡ã«ã€ããŠã®å°ããªå¿
é ã®ç޹ä»ããå§ãŸããŸã-ãã¹ãŠã®ããŒã¿ããŒã¹ã®ãŠãããŒãµã«OOPã¢ããã¿ãŒã¯ãHibernateãéæ³ã®ããã«åäœããªãããšã瀺ããŸãããå
éšã§ã¯åãJDBCãã³ã³ãããŒå
ã®JTAãªã©ã䜿çšããŸããããã«ã æœè±¡åã¬ãã«ã®ãã§ãŒã³å
šäœãèŠãŠããã®äžéšãšç§»è¡ãããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ãããããšãçè§£ããããããæ¹åããããã«ããããæž¬å®ã§ããå¿
èŠããããŸãã
枬å®ã«ã¯ãHibernateèªäœã®ãã°ïŒ hibernate.generate_statistics=true
ã DEBUG
ã¬ãã«ã®ãã¬ãŒorg.hibernate.stat
ãªã©ïŒã䜿çšãããã JMHã§ãã€ã¯ããã³ãããŒã¯ãæžã蟌ãããšããå§ãããŸãã
ããŒã¿ããŒã¹ã«éä¿¡ãããã¯ãšãªã確èªããã«ã¯ãããããçš®é¡ã®ããŒã¿ãœãŒã¹ãããã·ïŒp6spyãdatasource-proxiesãªã©ïŒã䜿çšããçããŒã¿ãç£èŠããããšããå§ãããŸãã äœããã®çš®é¡ã®ã«ãŠã³ãã€ã³ã¿ãŒã»ãã¿ãŒãé
眮ããŠãããŒã¿ããŒã¹ã«éä¿¡ãããç©çãªã¯ãšã¹ãã®æ°ãèšç®ã§ããŸãã ãããŠãã¡ãããHibernateèªäœã§ã¯ãšãªãã®ã³ã°ãæå¹ã«ããããšãã§ããŸãã
ããã«ãNikolayã¯ãæ¯èŒçå°ããªãªã¯ãšã¹ãã§ãã£ãŠããHibernateãã°ã§ã©ãã ãè峿·±ãæ
å ±ãèªã¿åãããã瀺ããŠããŸãã ãã°ã¯æ²é³Žãäžãããã¹ãŠãããªãã«ãšã£ãŠééã£ãŠããããšãå«ã³ãããªãã¯ç·æ¥ã«ãããããçŽãå¿
èŠããããŸãã ïŒç¢ºãã«ãéåžžãé·ã鳎ããŸã§èª°ããããèªã¿åããŸãããïŒãã°ãå«ããããšã¯ããã°ã®çµ±èšãèªã¿åãæ¹æ³ãã©ãã§ãã©ã®æéãè²»ããããã瀺ããŸãã
ãã®ã¬ããŒãã§ã¯ã調æŽã§ããäž»èŠãªäºé
ã«ã€ããŠèª¬æããŠããŸãã , JDBC, connection pool â , . , JDBC Session.doWork(), .
, , . , N+1. - , «, N+1 â , », ⊠, . . â : , , , NamedEntityGraph ( Hibnerate, JPA, ).

, second level cache . , , Hibernate, second level cache, , , â - ( ). Query Cache .

, - , . - , Hibernate. ? , , â , Ruby. , , ( Hibernate) â « », . «» .
: (Red Hat); : 4.64 ± 0.04.
, . , .
. , ? : Hibernate (, ), Spring â . . Garbage Collector?
, , . , , . (, , â .)
, , , , , . , .
, . â Garbage Collector Shenandoah, . , . «Shenandoah» «» ( ) «á» ( ).
-, GC Handbook . , GC , â . â GC Handbook. .
â , GC. Shenandoah .

, Shenandoah , .

, , . , , , Shenandoah .
. â Concurrent Mark, GC, , . â !

( , Epsilon GC , ).
-- . , STW- , .

, STW, concurrent-, (incremental update snapshot-at-the-beginning â SATB).

, , :-)

, init mark final mark â rootset, â .
, concurrent copy â , concurrent mark. , stop the world.

, , â . Garbage Collection, . , Garbage Collection .
, , Joker 2017, .
:
- , JVM , Shenandoah GC ;
- , , Java-;
- , GC. GC , . , , , . .
ãããã«
JPoint 2017 . , .
. .
JPoint , , . , 6-7 , - JPoint 2018 , , . .