
ãããããJavaScriptã¯ãœãããŠã§ã¢éçºã§æãéèŠãªææ°ãã¯ãããžãŒã§ãããšèšã£ãŠãååã§ãããã ããã°ã©ãã³ã°èšèªãã³ã³ãã€ã©ãŒãããã³ä»®æ³ãã·ã³ãç ç©¶ããå€ãã®äººã
ã«ãšã£ãŠãJavaScriptèšèªã®æ§é ãšããç¹ã§ãã®åªé
ãããã¹ãŠã³ã³ãã€ã«ã«é¢ããŠãŸã ååã«æé©åãããŠããããçŽ æŽãããæšæºã©ã€ãã©ãªãèªãããšãã§ããªããšããäºå®ã¯äŸç¶ãšããŠé©ãã¹ãããšã§ãã 察話è
ã誰ã§ãããã«å¿ããŠãJavaScriptã®æ¬ é¥ãæ°é±éã«ããã£ãŠãªã¹ãããŠããèããããšããªããããªå¥åŠãªãã®ãèŠã€ããããšãã§ããŸãã ããããæãããªæ¬ é¥ã«ããããããã仿¥ãJavaScriptã¯Webã®éèŠãªæè¡ã§ããããµãŒããŒ/ã¯ã©ãŠãé åã§ã®åªäœæ§ã«åãã£ãŠããŸãïŒNode.jsã®ãããã§ãïŒããŸããã¢ãã®ã€ã³ã¿ãŒãããã«ã浞éããŠããŸãã
質åã¯-ãªãJavaScriptã¯ãããªã«äººæ°ãããã®ã§ããïŒ å
æ¬çãªçãããªãã®ã§ã¯ãªãããšå¿é
ããŠããŸãã 仿¥ããã®èšèªã䜿çšããå€ãã®çç±ããããŸãããæãéèŠãªã®ã¯ãããããJavaScriptãšç¡æ°ã®ãªãœãŒã¹ãäžå¿ã«æ§ç¯ããã巚倧ãªãšã³ã·ã¹ãã ã§ãã ããããããã¯ãã¹ãŠããçšåºŠã®çµæã§ãã ãããŠããªããã®èšèªã¯æåã«æ®åããã®ã§ããïŒ ããªãã¯èšãããšãã§ããŸãïŒãªããªã圌ã¯é·ãéããŠã§ãã®å
±éèªã ã£ãããã§ãã ããããããã¯ããªãåã®ããšã§ãããéçºè
ã¯JavaScriptãæ
ç±çã«å«ã£ãŠããŸããã æ¯ãè¿ã£ãŠã¿ããšãJavaScriptã®äººæ°ã¯2000幎代åŸåã«å§ãŸããŸããã ã¡ããã©ãã®é ãJavaScriptãšã³ãžã³ã¯ããŸããŸãªè² è·ã§ã¯ããã«é«éã«åäœãå§ãããããããã®èšèªã«å¯Ÿããå€ãã®äººã
ã®æ
床ã«åœ±é¿ãäžããŸããã
åœæããã¹ãŠã®JSãã€ã¯ã
ãã³ãããŒã¯ã® å
é§ãã§ããApple
SunSpiderããMozilla
KrakenãšGoogle V8ãŸã§ããããã
äŒçµ±çãªJavaScriptãã³ãããŒã¯ãéåºŠã®æž¬å®ã«äœ¿çšãããŠããŸããã ãã®åŸãGoogleãã³ãããŒã¯ã¯
Octaneã«åã£ãŠä»£ãããAppleã¯
JetStreamããªãªãŒã¹ããŸããã ãããã®åŸæ¥ã®ãã³ãããŒã¯ã¯ãJavaScriptã®ããã©ãŒãã³ã¹ãäžçŽã®å€ããç®ã«èª°ãäºæ³ããªãã£ããããªé«ãã«ããããã«ãä¿¡ããããªãã»ã©ã®åªåãããŠããŸããã æ°åã®å éãèšé²ãããçªç¶
<script>
䜿çšãæªéãšã®ãã³ã¹ã§ãªããªããã¯ã©ã€ã¢ã³ãåŽã§ã®èšç®ã®å®è¡ãå¯èœã«ãªã£ãã ãã§ãªãã奚å±ãããŸããã
åºå
žïŒ V8ããã³Web Assemblyã䜿çšããé«åºŠãªJSããã©ãŒãã³ã¹ ãChrome Developer Summit 2016ã @ s3ththompson2016幎ã«ã¯ããã¹ãŠã®ïŒéèŠãªïŒJSãšã³ãžã³ãä¿¡ããããªãã»ã©ã®ããã©ãŒãã³ã¹ãéæããWebã¢ããªã±ãŒã·ã§ã³ã¯ãã€ãã£ãã®ãã®ãšåããããé«éã«ãªããŸããïŒãŸãã¯é«éã«ãªããŸãïŒã ãšã³ãžã³ã«ã¯ãé«åºŠã«æé©åããããã·ã³ã³ãŒãã®çãã·ãŒã±ã³ã¹ãçæããæŽç·Žãããæé©åã³ã³ãã€ã©ãä»å±ããŠããŸãã ããã¯ãããŸããŸãªã¿ã€ã/ãã©ãŒã ã§å©çšå¯èœãªçµ±èšã«å¿ããŠãåæäœïŒããããã£ããã€ããªæäœãæ¯èŒãåŒã³åºããªã©ãžã®ã¢ã¯ã»ã¹ïŒã®ã¿ã€ã/ãã©ãŒã ïŒã¿ã€ã/圢ç¶ïŒãæ
éã«éžæããããšã§å®çŸãããŸãã ãããã®æé©åã®å€§éšåã¯ãSunSpiderãKrakenãªã©ã®ãã€ã¯ããã³ãããŒã¯ãããã³OctaneãJetStreamãªã©ã®çµ±èšããã±ãŒãžã«ãã£ãŠæ±ºå®ãããŸããã
asm.jsã
Emscriptenãªã©ã®JavaScriptããŒã¹ã®ãã¯ãããžãŒã®ãããã§
ã仿¥ã§ã¯JavaScriptã§å€§èŠæš¡ãªC ++ã¢ããªã±ãŒã·ã§ã³ãã³ã³ãã€ã«ããããŠã³ããŒããã€ã³ã¹ããŒã«ãªãã§ãã©ãŠã¶ãŒã§å®è¡ã§ããŸãã ããšãã°ã
AngryBotsã§ã¯ç°¡åã«ãªã³ã©ã€ã³ã§ç°¡åã«ãã¬ã€ã§ããŸããã以åã¯Adobe FlashãChrome PNaClãªã©ã®ç¹å¥ãªãã©ã°ã€ã³ãå¿
èŠã§ããã
ããããã¹ãŠã®ææã®å€§éšåã¯ããã€ã¯ããã³ãããŒã¯ãšããã©ãŒãã³ã¹æž¬å®ããã±ãŒãžã®ååšãããã³åŸæ¥ã®JSãã³ãããŒã¯éã§çããç«¶äºã®ãããã§å¯èœã«ãªããŸããã SunSpiderã«ã€ããŠã¯äœã§ãèšãããšãã§ããŸããããããªãã§ã¯JavaScriptã®ããã©ãŒãã³ã¹ã仿¥ãšã»ãšãã©å€ãããªãããšã¯æããã§ãã
ããããååãªè³è³ãããã¯ã³ã€ã³ã®è£ãèŠãŠã¿ãæéã§ãã ãã¹ãŠã®æž¬å®ãã¹ãã¯ããã€ã¯ããã³ãããŒã¯ã§ãã倧ããªããã±ãŒãžã§ãããæéãçµã€ã«ã€ããŠç¡é¢ä¿ã«ãªãéåœã«ãããŸãïŒ ãªãã§ïŒ ãã³ãããŒã¯ã¯ãããªããããã§éãã§å§ãããŸã§ãããªãã«äœããæããããšãã§ããããã§ãã ç¹å®ã®ãããå€ãè¶
ããïŒãŸãã¯è¶
ããªãïŒãšããã«ãç¹å®ã®ãã³ãããŒã¯ã§åŸãããæé©åã®äžè¬çãªé©çšæ§ã¯ææ°é¢æ°çã«äœäžããŸãã
ããšãã°ãOctaneããããã·ãšããŠäœ¿çšããŠãå®éã®Webã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã枬å®ããŸããã ãããŠãã°ããã®éã圌ã¯ãã®ä»äºã«éåžžã«ããŸã察åŠããŸããã ãããã仿¥ã§ã¯ãOctaneãšå®éã®ã¢ããªã±ãŒã·ã§ã³ã§ã®æéã®ååžã¯å€§ããç°ãªããããOctaneãããã«æé©åããŠããå®éã®ã¢ããªã±ãŒã·ã§ã³ïŒNode.jsãå«ãïŒã倧å¹
ã«æ¹åãããããšã¯ã»ãšãã©ãããŸããã
åºå
žïŒ Real-World JavaScript Performance ãBlinkOn 6 Conferenceã @ tverwaesJetStreamãšOctaneã®ææ°ããŒãžã§ã³ãå«ãJavaScriptããã©ãŒãã³ã¹ã枬å®ããããã®åŸæ¥ã®ãã³ãããŒã¯ã®ãã¹ãŠãæä»£é
ãã«ãªã£ãŠããããã«ãªã£ãããšããŸããŸãæããã«ãªã£ãããããããã¡ã€ãªã³ã°ãšV8ããã³Chromeçšã®æ°ããã€ã³ã¿ãŒã»ãã¿ãŒã远å ããŠãå®éã®ã¢ããªã±ãŒã·ã§ã³ã枬å®ããæ°ããæ¹æ³ãæ¢ãå§ããŸãããã¬ãŒã¹ã ãŸããã¹ã¯ãªããã®å®è¡ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãã³ã³ãã€ã«ãªã©ããµã€ãã®é²èЧã«ããå€ãã®æéãè²»ããããšãçè§£ããããã«ããŒã«ã䜿çšããŸããã ç ç©¶çµæã¯éåžžã«è峿·±ããäºæ³å€ã§ããã åã®å³ãããããããã«ãOctaneãèµ·åãããšã70ïŒ
以äžã®æéãJavaScriptãšã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã«è²»ããããŸãããJavaScriptã䜿çšãããµã€ãã®é²èЧã«ãããæéã¯åžžã«30ïŒ
æªæºã§ãããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã«ãããæéã¯5ïŒ
以äžã§ãã ããããè§£æãšã³ã³ãã€ã«ã«ã¯å€ãã®æéãããããOctaneã«ã€ããŠã¯èšããŸããã ãã®ãããJavaScriptã®å®è¡ãæé©åããããã®çžåœãªåªåã«ãããOctaneã®ãªãŠã ã倧å¹
ã«å¢å ããŸããããµã€ãã®èªã¿èŸŒã¿ã¯ããã»ã©éããããŸããã ããã«ãJavaScriptã®å®è¡ãæé©åããè¶£å³ã¯ãã³ã³ãã€ã«ã«æéãããããããå®éã®ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæãªãå¯èœæ§ããããŸãããŸãã¯ãã³ã³ãã€ã«ãICãã©ã³ã¿ã€ã ãæ¡åŒµãã远å ã®ãã©ã¡ãŒã¿ãŒã远跡ããå¿
èŠããããŸãã

JavaScript
ã DOMãå«ãããã©ãŠã¶å
šäœã®ããã©ãŒãã³ã¹ã枬å®ããããšããå¥ã®ãã³ãããŒã¯ããã±ãŒãžã
ãããŸãïŒ
Speedometer ã 圌ã¯ãããŸããŸãªäººæ°ã®ããWebãã¬ãŒã ã¯ãŒã¯ã«å®è£
ãããã·ã³ãã«ãª
TodoMVCã¢ããªã±ãŒã·ã§ã³ãèµ·åããããšã§ãããçŸå®çã«æž¬å®ã«ã¢ãããŒãããããšããŸãïŒä»æ¥ã¯å°ãæä»£é
ãã§ãããæ°ããããŒãžã§ã³ããã§ã«äœæãããŠããŸãïŒã ããã±ãŒãžã«ã¯ãæ°ãããã¹ãïŒè§åºŠããšã³ããŒãåå¿ãããã©ããã©ã€ããããã¯ããŒã³ïŒãå«ãŸããŠããŸãã 仿¥ãŸã§ãã¹ããŒãã¡ãŒã¿ãŒã¯å®éã®ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã枬å®ããããã®æã奜ãŸãããããã·ã®åœ¹å²ã®ããã§ãã ãã ããããã¯2016幎åã°ã®ããŒã¿ã§ãããWebã§äœ¿çšããããã¿ãŒã³ãéçºããããšããã¹ãŠãæ¢ã«å€æŽãããå¯èœæ§ãããããšã«æ³šæããŠãã ããïŒããšãã°ãICã·ã¹ãã ããªãã¡ã¯ã¿ãªã³ã°ããŠã³ã¹ãã倧å¹
ã«åæžã
ãããŒãµãŒãåèšèšããŸã ïŒã äžèšã®ç¶æ³ã¯ãµã€ãã®é²èЧã«ã®ã¿é¢ä¿ããŠããããã§ãããå®éã®Node.jsã¢ããªã±ãŒã·ã§ã³ã®å ŽåãåŸæ¥ã®ããŒã¯ããã©ãŒãã³ã¹ã®ãã³ãããŒã¯ã¯ãããã·ããŒã«ã«å¯ŸããŠããŸãããŸãæ©èœããªããšããéåžžã«èª¬åŸåã®ãã蚌æ ãåãåããŸããã
åºå
žïŒ Real-World JavaScript Performance ãBlinkOn 6 Conferenceã @ tverwaesããããããã¯ãã¹ãŠå¹
åºãèªè
ã«ãã§ã«ç¥ãããŠããã®ã§ãJSã³ãã¥ããã£ãæçšã§ããçç±ã説æããããã€ãã®å
·äœçãªäŸã ããåãäžããŸãããããæç¹ã§ããŒã¯ããã©ãŒãã³ã¹ã®éçãã³ãããŒã¯ã«æ³šæãæããªãããšãéåžžã«éèŠã§ãã JSãšã³ãžã³ãã©ã®ããã«ãã³ãããŒã¯ã«åæ Œããå®éã«ã©ã®ããã«ãããè¡ããã®äŸããå§ããŸãããã
æªåé«ãSunSpiderã®äŸ
åŸæ¥ã®JSãã³ãããŒã¯ã«é¢ããèšäºã¯ãSunSpiderã®æãããªåé¡ã«ã€ããŠèšåããŠããªããã°äžå®å
šã§ãã å®éã®ç¶æ³ã§ã®é©çšæ§ãå¶éãããŠããããã©ãŒãã³ã¹ãã¹ãã
bitops-bitwise-and.jsããå§ããŸãããã

ç¹ã«C / C ++ããJavaScriptãžã®ãã©ã³ã¹ãã€ã«ã³ãŒãã§ã¯ãé«éãªãããåäœã®ANDæŒç®ãå¿
èŠãšããã¢ã«ãŽãªãºã ãããã€ããããŸãã ãã ããWebããŒãžãããšã³ãžã³ãä»ã®ãšã³ãžã³ã®2åã®é床ã§ãããåäœã®ANDæŒç®ãå®è¡ã§ãããã©ãããèæ
®ããããšã¯ã»ãšãã©ãããŸããã ããããããµã€ã¯ã«ã®æåã®å埩ã®åŸãbitwiseAndValueã0ã«çãããªããæ¬¡ã®599,999ã®å埩ã®éã¯ãã®å€ã®ãŸãŸã«ãªãããšã«æ°ã¥ããã§ãããã ãããã£ãŠãè¯å¥œãªããã©ãŒãã³ã¹ã§ãã€ãŸããŸãšããªããŒããŠã§ã¢ã§5ããªç§ãè¶
ããŠå®è¡ãããšããã«ããã®ãµã€ã¯ã«ã®æåã®å埩ã®ã¿ãå¿
èŠã§ãããæ®ãã¯ãã¹ãŠæéã®ç¡é§ïŒã€ãŸãããããã³ãŒãåŸïŒã§ããããšãçè§£ããããšããŠããã®ãã³ãããŒã¯ã®è¿œè·¡ãéå§ã§ããŸã
åæãµã€ã¯ã« ïŒã ãã®JavaScriptãžã®å€æãå®è¡ããã«ã¯ã以äžã確èªããå¿
èŠããããŸãã
bitwiseAndValue
ã¹ã¯ãªããå®è¡åã®ã°ããŒãã«ãªããžã§ã¯ãã®å
±éããããã£ã§ãããã©ããã- ãã®ãããã°ããŒãã«ãªããžã§ã¯ãããã®ãããã¿ã€ããªã©ã®ã€ã³ã¿ãŒã»ãã¿ãŒã¯ãããŸããã
ããããæ¬åœã«ãã³ãããŒã¯ã«åã¡ãããšæã£ãŠããããã®ããã®æºåãã§ããŠããå Žåã¯ã1 msæªæºã§ãã¹ããå®è¡ã§ããŸãã ããããæé©åã®é©çšå¯èœæ§ã¯ãã®ç¹å®ã®ã±ãŒã¹ã«ãã£ãŠã®ã¿å¶éããããã¹ããžã®å°ããªå€æŽã¯ããããåäœã«ã€ãªãããŸããã
ã€ãŸãã
bitops-bitwise-and.jsãã¹ãã¯ã
ãã€ã¯ããã³ãããŒã¯ã®ææªã®äŸã§ããã ããå®çšçãªäŸã«ç§»ããŸããã
-string-tagcloud.js test ã å®éãjson.js
json.js
éåžžã«åæã®ããŒãžã§ã³ã
json.js
ãŸãã ããããããã®ãã¹ãã¯ä»¥åã®ãã¹ããããã¯ããã«åççã«èŠããã§ãããã ãããããã³ãããŒã¯ãããã¡ã€ã«ã詳ããèŠããšã圌ãåäžã®
eval
åŒã«å€ãã®æéãè²»ãããŠããããšãæããã«ãªããŸãïŒè§£æããã³ã³ã³ãã€ã«ã®åèšå®è¡æéã®æå€§20ïŒ
ãã³ã³ãã€ã«ãããã³ãŒãã®å®éã®å®è¡ã§ã10ïŒ
ãŸã§ïŒã

ããèŠãŠã¿ãŸãããïŒ
eval
ã¯äžåºŠã ãå®è¡ããã
tag
ãš
popularity
ãã£ãŒã«ããæã€2501ãªããžã§ã¯ãã®é
åãå«ãJSONæååã«æž¡ãããŸãïŒ
([ { "tag": "titillation", "popularity": 4294967296 }, { "tag": "foamless", "popularity": 1257718401 }, { "tag": "snarler", "popularity": 613166183 }, { "tag": "multangularness", "popularity": 368304452 }, { "tag": "Fesapo unventurous", "popularity": 248026512 }, { "tag": "esthesioblast", "popularity": 179556755 }, { "tag": "echeneidoid", "popularity": 136641578 }, { "tag": "embryoctony", "popularity": 107852576 }, ... ])
æããã«ããããã®ãªããžã§ã¯ããªãã©ã«ãè§£æãããã€ãã£ãã³ãŒããçæããŠå®è¡ããã®ã¯é«äŸ¡ã§ãã å
¥åæååãJSONãšããŠè§£æãã察å¿ãããªããžã§ã¯ãã°ã©ããçæããæ¹ãã¯ããã«å®äŸ¡ã§ãã ãã³ãããŒã¯ã®çµæãæ¹åããã«ã¯ãæåã«
eval
ãJSONãšããŠè§£éããJSONãšããŠèªã¿åããªãå Žåã«ã®ã¿å®éã«è§£æãã³ã³ãã€ã«ãããã³å®è¡ã詊ã¿ãããšãã§ããŸãïŒãã ããæ¬åŒ§ãã¹ãããããã«ã¯è¿œå ã®éæ³ãå¿
èŠã§ãïŒã 2007幎ã«ã¯ã
JSON.parseã
ãŸã ååšããŠ
ããªãã£ããããããã¯æªãããã¯ã§ã¯ãªãã£ãã§ãããã ãããŠã2017幎ãŸã§ã«ãããã¯JavaScriptãšã³ãžã³ã®æè¡ç矩åã«å€ããã
eval
ã®äœ¿çšãé
ãããå¯èœæ§ããããŸããã åºæ¬çã«ææ°ã®JavaScriptã«ãã³ãããŒã¯ãæŽæ°ãã
--- string-tagcloud.js.ORIG 2016-12-14 09:00:52.869887104 +0100 +++ string-tagcloud.js 2016-12-14 09:01:01.033944051 +0100 @@ -198,7 +198,7 @@ replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(:?[eE][+\-]?\d+)?/g, ']'). replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { - j = eval('(' + this + ')'); + j = JSON.parse(this); return typeof filter === 'function' ? walk('', j) : j; }
çç£æ§ã®å³æåäžã«ã€ãªãããŸããçŸåšãV8 LKGRã®ã©ã³ã¿ã€ã ã¯36ããªç§ãã26ããªç§ã«ççž®ããã30ïŒ
ã®æ¹åããããŸãã
$ node string-tagcloud.js.ORIG Time (string-tagcloud): 36 ms. $ node string-tagcloud.js Time (string-tagcloud): 26 ms. $ node -v v8.0.0-pre $
ããã¯ãéçãã³ãããŒã¯ãšããã©ãŒãã³ã¹ãã¹ãããã±ãŒãžã®äžè¬çãªåé¡ã§ãã 仿¥ã誰ãçå£ã«
eval
ã䜿çšããŠJSONããŒã¿ãè§£æããŸããïŒããã©ãŒãã³ã¹ã ãã§ãªãã»ãã¥ãªãã£ã®ããïŒã 代ããã«ãéå»5幎éã«èšè¿°ããããã¹ãŠã®ã³ãŒãã¯
JSON.parseã䜿çšã
ãŸã ã ããã«ãå®çšŒåç°å¢ã§JSONãè§£æããããã«
eval
ã䜿çšããããšã¯ãã°ãšèŠãªãããšãã§ããŸãïŒ ãããã£ãŠããã®å€ä»£ã®ãã³ãããŒã¯ã§ã¯ãæ¯èŒçæè¿äœæãããã³ãŒãã®çç£æ§ãé«ããããã®ãšã³ãžã³ã®äœæè
ã®åªåã¯èæ
®ãããŠããŸããã 代ããã«ã
string-tagcloud.js
ã§è¯ãçµæãåŸãããã«ã
eval
äžå¿
èŠã«è€éã«ããããšãæçšã§ãããã
å¥ã®äŸ
-3d-cube.jsã«é²ã¿ãŸãããã ãã®ãã³ãããŒã¯ã¯ãå€ãã®è¡åæŒç®ãå®è¡ããŸããããã«ãããæãã€ã³ããªãžã§ã³ããªã³ã³ãã€ã©ãŒã§ãããåã«å®è¡ããããšããã§ããŸããã ãã³ãããŒã¯ã¯ãã«ãŒã颿°ãšãããåŒã³åºã颿°ã®å®è¡ã«å€ãã®æéãè²»ãããŸãã

è峿·±ã芳å¯ïŒé¢æ°
RotateX
ã
RotateY
RotateZ
åžžã«å®æ°ãã©ã¡ãŒã¿ãŒ
Phi
åŒã³åºãããŸãã

ããã¯ã
Math.sinãš
Math.cosã«å¯ŸããŠåžžã«204ååãå€ãèšç®ããããšãæå³ããŸãã å
¥åå€ã¯3ã€ã®ã¿ã§ãã
- 0.017453292519943295
- 0.05235987755982989
- 0,08726646259971647
åãæ£åŒŠå€ãšäœåŒŠå€ã®äžå¿
èŠãªèšç®ãé¿ããããã«ã以åã«èšç®ãããå€ããã£ãã·ã¥ã§ããŸãã 以åã¯ãV8ã¯ãŸãã«ãããè¡ããŸããããä»ã®ãã¹ãŠã®ãšã³ãžã³ã¯ãŸã ããããŠããŸãã V8ãã
è¶
è¶ãã£ãã·ã¥ãšåŒã°ãããã®ãåé€ããŸãããããã¯ãé£ç¶ããåãå€ãåžžã«èšç®ãããšã¯éããªããšãã«ãå®éã®è² è·ã®äžã§åé·æ§ãé¡èã ã£ãããã§ãã SunSpiderãã³ãããŒã¯ã®çµæã§å€ã倱æãããã®ç¹å®ã®æé©åãåé€ããŸãããããã³ãããŒã¯çšã«æé©åãããšåæã«ãå®éã®ãããžã§ã¯ãã®çµæãæªåãããããšã¯æå³ããªããšç¢ºä¿¡ããŠããŸãã
ãœãŒã¹ïŒ arewefastyet.comæããã«ããã®ãããªå®æ°ã䜿çšããæè¯ã®æ¹æ³-å
¥åæ£åŒŠ/äœåŒŠ-ã¯ãéåžžã®ã€ã³ã©ã€ã³ãã¥ãŒãªã¹ãã£ãã¯ãã¥ãŒãªã¹ãã£ãã¯ã§ããããã¯ã眮æã®ãã©ã³ã¹ãåãã宿°ãã©ãŒã«ãã£ã³ã°ãæçšãªå Žåã«åŒã³åºããã€ã³ãã§ã®çœ®æèšå®ãªã©ã®ããŸããŸãªèŠå ãèæ
®ããããšããŸãïŒå®æ°ãã©ãŒã«ãã£ã³ã°ïŒïŒ
RotateX
ã
RotateY
ã
RotateZ
ã®å Žåãš
RotateZ
ïŒã ããããããã€ãã®çç±ãããããã¯ã¯ã©ã³ã¯ã·ã£ããã³ã³ãã€ã©ã«ã¯é©ããŠããŸããã§ããã ãã ããããã¯Ignitionããã³TurboFanã®å Žåã®åççãªãªãã·ã§ã³ã§ãã
ã代æ¿ãã¥ãŒãªã¹ãã£ãã¯ã®æ¹åã«æ¢ã«åãçµãã§ããŸãã
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¯æå®³ãšèŠãªãããŸã
ç¹å®ã®ã±ãŒã¹ã«å ããŠãSunSpiderã«ã¯å¥ã®åºæ¬çãªåé¡ããããŸããããã¯ãåèšå®è¡æéã§ãã çŸåšãé©åãªIntelããŒããŠã§ã¢ã§ã¯ãV8ãšã³ãžã³ã¯çŽ200ããªç§ã§ãã³ãããŒã¯å
šäœãå®è¡ããŸãïŒæ°ããã¹ããŒã¹ã®çããŠãããªããžã§ã¯ããšå€ãã¹ããŒã¹ã®æçåã«äŸåããŸãïŒããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®äž»èŠãªäžæåæ¢ã¯ç°¡åã«30ããªç§ã«éããŸãã ãŸããã€ã³ã¯ãªã¡ã³ã¿ã«ããŒãã³ã°ã®ã³ã¹ãã¯èæ
®ãããŠããŸãããããã¯ãSunSpiderããã±ãŒãžã®åèšå®è¡æéã®10ïŒ
以äžã§ãã ãããã£ãŠãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®ããã«ãšã³ãžã³ã®é床ã10ã20ïŒ
äœäžããããªãå Žåã¯ãSunSpiderã®å®è¡äžã«ãšã³ãžã³ãéå§ãããªãããã«ããå¿
èŠããããŸãã

ãã®ããã«ãããŸããŸãªããªãã¯ã䜿çšãããŸãããããããã¹ãŠã¯ãç§ãç¥ãéããå®éã®ã¿ã¹ã¯ã«ãã©ã¹ã®å¹æã¯ãããŸããã V8ã¯ãããè¡ããŸãïŒåSunSpiderãã¹ãã¯ãæ°ãã
ãã€ãã£ãã³ã³ããã¹ãã«å¯Ÿå¿ããæ°ãã
<iframe>
ã§å®è¡ãããããã
<iframe>
ã®äœæãšé
眮ãç»é²ããã ãã§ãïŒåSunSpiderãã¹ãã«è²»ããæéã¯50ããªç§æªæºã§ãïŒã ãããŠããã¹ãäžã§ã¯ãªããé
眮æé ãšäœææé ã®éã§ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãå®è¡ãããŸãã ãã®ããªãã¯ã¯ããŸãæ©èœãã99.99ïŒ
ã®ã±ãŒã¹ã§ã¯å®éã®ãããžã§ã¯ãã«ã¯åœ±é¿ããŸããã ããããV8ãã¢ããªã±ãŒã·ã§ã³ãSunSpiderãã¹ãã®ããã«èŠãããšå€æããå Žåãã¬ããŒãžã³ã¬ã¯ã¿ãŒã匷å¶çã«å®è¡ããããããäœæ¥éåºŠã«æªåœ±é¿ãåãŒããŸãã ãããã£ãŠ
ãã¢ããªã±ãŒã·ã§ã³ãSunSpiderã®ããã«èŠããªãã§ãã ãã ã
SunSpiderã«é¢é£ããä»ã®äŸãæããããšã¯ã§ããŸããã圹ã«ç«ã€ãšã¯æããŸããã åªããããã©ãŒãã³ã¹ã®çµæãäžåãããã«SunSpiderãæé©åããããšã¯ãå®éã®ã¢ããªã±ãŒã·ã§ã³ã«ã¯æå³ããªãããšã¯ããã§ã«æããã§ããããšãé¡ã£ãŠããŸãã ãšã³ãžã³ã¯ãã®ããã±ãŒãžã«ã®ã¿æçšã§ãå®éã®ç¶æ³ã§ã¯æå®³ã«ãªãå¯èœæ§ã®ããå¥åŠãªããã¯ã䜿çšã§ãããããSunSpiderããããªãã£ããäžçã¯æ©æµãåãããšæããŸãã
æ®å¿µãªãããèšè
ããã©ãŠã¶ã®ããã©ãŒãã³ã¹ãã©ã®ããã«èããŠããããæ¯èŒãããšããSunSpiderã¯äŸç¶ãšããŠãã¹ã³ãã§éåžžã«é »ç¹ã«äœ¿çšãããŠããŸãã ãŸãã¯ãããã«æªãããšã«ãã¹ããŒããã©ã³ãæ¯èŒããŸãïŒ ãã¡ãããã¡ãŒã«ãŒã®é¢å¿ãããã«ç€ºãããŠããŸãã Androidãã£ã³ãã¯ãChromeãSunSpiderïŒããã³ãã®ä»ã®ç¡æå³ãªãã³ãããŒã¯ïŒã§è¯å¥œãªçµæã瀺ãããšãéèŠã§ãã ã¹ããŒããã©ã³ã¡ãŒã«ãŒã¯è£œåã販売ããããšã§çšŒãå¿
èŠããããããã«ã¯è¯ãã¬ãã¥ãŒãå¿
èŠã§ãã äžéšã®äŒæ¥ã¯ãV8ã®å€ãããŒãžã§ã³ãã¹ããŒããã©ã³ã«æèŒããŠåºè·ããŠãããããSunSpiderã§ããè¯ãçµæã瀺ããŠããŸãã ãã®çµæããŠãŒã¶ãŒã¯éããããŠããªãã»ãã¥ãªãã£ããŒã«ã«é¥ããŸãããããã¯åŸã®ããŒãžã§ã³ã§ä¿®æ£ãããŠããŸãã ããã«ãå®éã«ã¯V8ã®å€ãããŒãžã§ã³ã¯ããé
ãåäœããŸãïŒ
åºå
žïŒGalaxy S7ããã³S7 Edgeã®ã¬ãã¥ãŒïŒãµã ã¹ã³ã®æé«ã®æè¡ãããã«ç£šãäžããwww.engadget.comJavaScriptã³ãã¥ããã£ã客芳çãªããã©ãŒãã³ã¹ããŒã¿ãååŸããããšã«æ¬åœã«é¢å¿ãããå Žåããžã£ãŒããªã¹ãããã©ãŠã¶ãŒãšã¹ããŒããã©ã³ãæ¯èŒãããšãã«åŸæ¥ã®ãã³ãããŒã¯ã®äœ¿çšã忢ããå¿
èŠããããŸãã åãã©ãŠã¶ã§ãã³ãããŒã¯ãå®è¡ããååŸããæ°å€ãæ¯èŒããæ¹ãç°¡åã§ããããšãçè§£ããŠããŸããããã®å Žåã¯ãã©ãããåãåãããã ããã -å°ãªããšãäœããã®åœ¢ã§çŸåšã®ç¶æ³ã«å¯Ÿå¿ãããã³ãããŒã¯ã«æ³šæããŠãã ããã ãããæ¬åœã®ãŠã§ãããŒãžã§ãã ãã©ãŠã¶ã®ãã³ãããŒã¯ã§2å°ã®ã¹ããŒããã©ã³ãæ¯èŒããå¿
èŠãããå Žåã¯ãå°ãªããšã
Speedometerã䜿çšããŠãã ãã ã
ã¯ã©ãŒã±ã³ãšã®ããã»ã©æçœã§ãªãç¶æ³
Krakenãã³ãããŒã¯ã¯
ã2010幎9æã«Mozillaã«ãã£ãŠãªãªãŒã¹ãããŸãã ã ã³ãŒãã®æçãšå®éã®ã¢ããªã±ãŒã·ã§ã³ã®ã³ã¢ãå«ãŸããŠãããšäž»åŒµãããŸããã ã¯ã©ãŒã±ã³ã¯ãSunSpiderãOctaneã»ã©JavaScriptã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããŠããªããããããŸãæéããããŸããã
audio-oscillator.jsãã¹ãã®äŸã®ã¿ã説æããŸãã

ãã¹ãã¯500åã
calcOsc
颿°ãåŒã³åºããŸãã æåã«ã
sine Oscillator
ã°ããŒãã«ã«å¯ŸããŠ
generate
ãåŒã³åºããæ¬¡ã«æ°ãã
Oscillator
äœæããããã«å¯ŸããŠgenerateãåŒã³åºããŠãããã
sine Oscillator
远å ããŸãã ããã§ãããè¡ãããçç±ã«ã€ããŠè©³ããã¯èª¬æããŸãããã
Oscillator
ãããã¿ã€ãã®
generate
ã¡ãœãããèŠãŠã¿ãŸãããã

ã³ãŒããèŠããšã倧éšåã®æéã¯é
åãžã®ã¢ã¯ã»ã¹ãä¹ç®ããŸãã¯
Math.roundã®åŸªç°åŒã³åºãã§å ããããŠãããšæ³å®ã§ããŸãã runtime
Oscillator.prototype.generate
offset % this.waveTableLength
. Intel-, , 20 %
idiv
, (modulus). :
waveTableLength
Oscillator 2048,
Oscillator
.

, â ,
Intel
idiv
.
calcOsc
/.
sine Oscillator
,
calcOsc
.
, . V8 - ,
+
,
*
%
, , , (.
Fast arithmetic for dynamic languages ).
fullcodegen Crankshaft,
BinaryOpIC
MOD
. V8 (c Crankshaft fullcodegen)
$ ~/Projects/v8/out/Release/d8 --trace-ic audio-oscillator.js [...SNIP...] [BinaryOpIC(MOD:None*None->None) => (MOD:Smi*2048->Smi) @ ~Oscillator.generate+598 at audio-oscillator.js:697] [...SNIP...] $
,
BinaryOpIC
(constant feedback) , , (
Smi
V8), .
--print-opt-code --code-comments
, , Crankshaft
Oscillator.prototype.generate
:
[...SNIP...] ;;; <@80,#84> load-named-field 0x133a0bdacc4a 330 8b4343 movl rax,[rbx+0x43] ;;; <@83,#86> compare-numeric-and-branch 0x133a0bdacc4d 333 3d00080000 cmp rax,0x800 0x133a0bdacc52 338 0f85ff000000 jnz 599 (0x133a0bdacd57) [...SNIP...] ;;; <@90,#94> mod-by-power-of-2-i 0x133a0bdacc5b 347 4585db testl r11,r11 0x133a0bdacc5e 350 790f jns 367 (0x133a0bdacc6f) 0x133a0bdacc60 352 41f7db negl r11 0x133a0bdacc63 355 4181e3ff070000 andl r11,0x7ff 0x133a0bdacc6a 362 41f7db negl r11 0x133a0bdacc6d 365 eb07 jmp 374 (0x133a0bdacc76) 0x133a0bdacc6f 367 4181e3ff070000 andl r11,0x7ff [...SNIP...] ;;; <@127,#88> deoptimize 0x133a0bdacd57 599 e81273cdff call 0x133a0ba8406e [...SNIP...]
,
this.waveTableLength
(
rbx
this
), , 2048 ( 0x800). ,
idiv
(
r11
i
), .
, , , , : ! , ( , ).
idiv
,
BinaryOpIC
Smi*Smi->Smi
. ,
Oscillator
,
waveTableLength
generate
. 20 % ,
Oscillator
'; (non-local penalization).
--- audio-oscillator.js.ORIG 2016-12-15 22:01:43.897033156 +0100 +++ audio-oscillator.js 2016-12-15 22:02:26.397326067 +0100 @@ -1931,6 +1931,10 @@ var frequency = 344.53; var sine = new Oscillator(Oscillator.Sine, frequency, 1, bufferSize, sampleRate); +var unused = new Oscillator(Oscillator.Sine, frequency, 1, bufferSize, sampleRate); +unused.waveTableLength = 1024; +unused.generate(); + var calcOsc = function() { sine.generate();
audio-oscillator.js
,
Oscillator
waveTableLength
, :
$ ~/Projects/v8/out/Release/d8 audio-oscillator.js.ORIG Time (audio-oscillator-once): 64 ms. $ ~/Projects/v8/out/Release/d8 audio-oscillator.js Time (audio-oscillator-once): 81 ms. $
. , , , . , , . , - -
BinaryOpIC
, 20- ( , ). , , .
JavaScript. , , JavaScript .
, , () . ,
idiv
, , ( ). TurboFan, Crankshaft, runtime , , () ():
if 0 < rhs then msk = rhs - 1 if rhs & msk != 0 then lhs % rhs else if lhs < 0 then -(-lhs & msk) else lhs & msk else if rhs < -1 then lhs % rhs else zero
( TurboFan):
$ ~/Projects/v8/out/Release/d8 --turbo audio-oscillator.js.ORIG Time (audio-oscillator-once): 69 ms. $ ~/Projects/v8/out/Release/d8 --turbo audio-oscillator.js Time (audio-oscillator-once): 69 ms. $
, , , , , . , JS- , Kraken , TurboFan.
TurboFan Crankshaft, , , , ! , , , , . . . , , , .
Kraken , JS- â Octane.
Octane
Octane â V8.
Google 2012 , Octane 2.0 â
2013- . 15 , â Splay Mandreel â (throughput) . , Microsofts TypeScript,
asm.js zlib, (ray tracer), .
. JavaScript, 2012 .
, Octane JavaScript 2012â2013-. . Octane (, TypeScript zlib
Emscripten , Mandreel ).
,
Ember AngularJS , JavaScript, Octane () . JavaScript , JS- , , Octane. , , Octane .
Octane, . , ! , Octane â JavaScript, . , JS- , , Octane â !
, , !Box2D,
Box2DWeb , , JavaScript. , JS- . , , , ( ).
D.prototype.UpdatePairs
():
D.prototype.UpdatePairs = function(b) { var e = this; var f = e.m_pairCount = 0, m; for (f = 0; f < e.m_moveBuffer.length; ++f) { m = e.m_moveBuffer[f]; var r = e.m_tree.GetFatAABB(m); e.m_tree.Query(function(t) { if (t == m) return true; if (e.m_pairCount == e.m_pairBuffer.length) e.m_pairBuffer[e.m_pairCount] = new O; var x = e.m_pairBuffer[e.m_pairCount]; x.proxyA = t < m ? t : m; x.proxyB = t >= m ? t : m; ++e.m_pairCount; return true }, r) } for (f = e.m_moveBuffer.length = 0; f < e.m_pairCount;) { r = e.m_pairBuffer[f]; var s = e.m_tree.GetUserData(r.proxyA), v = e.m_tree.GetUserData(r.proxyB); b(s, v); for (++f; f < e.m_pairCount;) { s = e.m_pairBuffer[f]; if (s.proxyA != r.proxyA || s.proxyB != r.proxyB) break; ++f } } };
, ,
e.m_tree.Query
:
function(t) { if (t == m) return true; if (e.m_pairCount == e.m_pairBuffer.length) e.m_pairBuffer[e.m_pairCount] = new O; var x = e.m_pairBuffer[e.m_pairCount]; x.proxyA = t < m ? t : m; x.proxyB = t >= m ? t : m; ++e.m_pairCount; return true }
, , . 4â7 %
runtime- Compare ,
(abstract relational comparison).

runtime-
CompareICStub , :
x.proxyA = t < m ? t : m; x.proxyB = t >= m ? t : m;
99 % ! ã©ãããŠïŒ , JavaScript,
.
t
m
â
L
, .
Symbol.toPrimitive
,
"toString"
,
"valueOf"
Symbol.toStringTag
, .
t < m
, :
- ToPrimitive (
t
, hint Number
). - OrdinaryToPrimitive (
t
, "number"
), Symbol.toPrimitive
. t.valueOf()
, t
, Object.prototype.valueOf .t.toString()
, "[object Object]"
, Object.prototype.toString , Symbol.toStringTag L
.- ToPrimitive (
m
, hint Number
). - OrdinaryToPrimitive (
m
, "number"
), Symbol.toPrimitive. m.valueOf()
, m, Object.prototype.valueOf .m.toString()
, "[object Object]"
, Object.prototype.toString , Symbol.toStringTag L
."[object Object]" < "[object Object]"
,
ã
t >= m
,
true
. , . : , :
--- octane-box2d.js.ORIG 2016-12-16 07:28:58.442977631 +0100 +++ octane-box2d.js 2016-12-16 07:29:05.615028272 +0100 @@ -2021,8 +2021,8 @@ if (t == m) return true; if (e.m_pairCount == e.m_pairBuffer.length) e.m_pairBuffer[e.m_pairCount] = new O; var x = e.m_pairBuffer[e.m_pairCount]; - x.proxyA = t < m ? t : m; - x.proxyB = t >= m ? t : m; + x.proxyA = m; + x.proxyB = t; ++e.m_pairCount; return true },
13 %, :
$ ~/Projects/v8/out/Release/d8 octane-box2d.js.ORIG Score (Box2D): 48063 $ ~/Projects/v8/out/Release/d8 octane-box2d.js Score (Box2D): 55359 $
? , ,
CompareIC
: (map)
(known receiver map tracking) ( V8 map â + ). . :
$ ~/Projects/v8/out/Release/d8 --trace-ic octane-box2d.js [...SNIP...] [CompareIC in ~+557 at octane-box2d.js:2024 ((UNINITIALIZED+UNINITIALIZED=UNINITIALIZED)->(RECEIVER+RECEIVER=KNOWN_RECEIVER))#LT @ 0x1d5a860493a1] [CompareIC in ~+649 at octane-box2d.js:2025 ((UNINITIALIZED+UNINITIALIZED=UNINITIALIZED)->(RECEIVER+RECEIVER=KNOWN_RECEIVER))#GTE @ 0x1d5a860496e1] [...SNIP...] $
CompareIC
, « » « »
RECEIVER
' (JavaScript- V8). (map)
0x1d5a860493a1
,
L
.
false
true
, : â
0x1d5a860493a1
.
L
,
the Symbol.toPrimitive
,
"valueOf"
"toString"
.
Symbol.toStringTag
. Crankshaft
Symbol.toStringTag
:

:

: , . , , , JS- . , ! , ( ,
true
false
, ). , , . ES2015, , (ES2015 â !).
Mandreel. C/C++ JavaScript.
asm.js ,
Emscripten , ( ). Octane
Bullet ,
Mandreel . MandreelLatency, . , Mandreel , . , . , . , .

Mandreel
global_init
, . , ( ), , , ( ). V8
. , , , .
global_init
Mandreel , + + .
global_init
, .
: arewefastyet.com .global_init
, 200- . , , , , ( ).
, â
splay.js . , (splay trees) ( ). : . (buckets) , . ! çè«çã«ã¯ã , :

, , , , SplayLatency. ãªãã§ïŒ , , . , (generational garbage collector), V8: (
generational hypothesis ), . V8 :
$ out/Release/d8 --trace-gc --noallocation_site_pretenuring octane-splay.js [20872:0x7f26f24c70d0] 10 ms: Scavenge 2.7 (6.0) -> 2.7 (7.0) MB, 1.1 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 12 ms: Scavenge 2.7 (7.0) -> 2.7 (8.0) MB, 1.7 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 14 ms: Scavenge 3.7 (8.0) -> 3.6 (10.0) MB, 0.8 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 18 ms: Scavenge 4.8 (10.5) -> 4.7 (11.0) MB, 2.5 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 22 ms: Scavenge 5.7 (11.0) -> 5.6 (16.0) MB, 2.8 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 28 ms: Scavenge 8.7 (16.0) -> 8.6 (17.0) MB, 4.3 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 35 ms: Scavenge 9.6 (17.0) -> 9.6 (28.0) MB, 6.9 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 49 ms: Scavenge 16.6 (28.5) -> 16.4 (29.0) MB, 8.2 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 65 ms: Scavenge 17.5 (29.0) -> 17.5 (52.0) MB, 15.3 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 93 ms: Scavenge 32.3 (52.5) -> 32.0 (53.5) MB, 17.6 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 126 ms: Scavenge 33.4 (53.5) -> 33.3 (68.0) MB, 31.5 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 151 ms: Scavenge 47.9 (68.0) -> 47.6 (69.5) MB, 15.8 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 183 ms: Scavenge 49.2 (69.5) -> 49.2 (84.0) MB, 30.9 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 210 ms: Scavenge 63.5 (84.0) -> 62.4 (85.0) MB, 14.8 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 241 ms: Scavenge 64.7 (85.0) -> 64.6 (99.0) MB, 28.8 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 268 ms: Scavenge 78.2 (99.0) -> 77.6 (101.0) MB, 16.1 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 298 ms: Scavenge 80.4 (101.0) -> 80.3 (114.5) MB, 28.2 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 324 ms: Scavenge 93.5 (114.5) -> 92.9 (117.0) MB, 16.4 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 354 ms: Scavenge 96.2 (117.0) -> 96.0 (130.0) MB, 27.6 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 383 ms: Scavenge 108.8 (130.0) -> 108.2 (133.0) MB, 16.8 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 413 ms: Scavenge 111.9 (133.0) -> 111.7 (145.5) MB, 27.8 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 440 ms: Scavenge 124.1 (145.5) -> 123.5 (149.0) MB, 17.4 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 473 ms: Scavenge 127.6 (149.0) -> 127.4 (161.0) MB, 29.5 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 502 ms: Scavenge 139.4 (161.0) -> 138.8 (165.0) MB, 18.7 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 534 ms: Scavenge 143.3 (165.0) -> 143.1 (176.5) MB, 28.5 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 561 ms: Scavenge 154.7 (176.5) -> 154.2 (181.0) MB, 19.0 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 594 ms: Scavenge 158.9 (181.0) -> 158.7 (192.0) MB, 29.2 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 622 ms: Scavenge 170.0 (192.5) -> 169.5 (197.0) MB, 19.5 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 655 ms: Scavenge 174.6 (197.0) -> 174.3 (208.0) MB, 28.7 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 683 ms: Scavenge 185.4 (208.0) -> 184.9 (212.5) MB, 19.4 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 715 ms: Scavenge 190.2 (213.0) -> 190.0 (223.5) MB, 27.7 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 743 ms: Scavenge 200.7 (223.5) -> 200.3 (228.5) MB, 19.7 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 774 ms: Scavenge 205.8 (228.5) -> 205.6 (239.0) MB, 27.1 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 802 ms: Scavenge 216.1 (239.0) -> 215.7 (244.5) MB, 19.8 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 833 ms: Scavenge 221.4 (244.5) -> 221.2 (254.5) MB, 26.2 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 861 ms: Scavenge 231.5 (255.0) -> 231.1 (260.5) MB, 19.9 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 892 ms: Scavenge 237.0 (260.5) -> 236.7 (270.5) MB, 26.3 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 920 ms: Scavenge 246.9 (270.5) -> 246.5 (276.0) MB, 20.1 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 951 ms: Scavenge 252.6 (276.0) -> 252.3 (286.0) MB, 25.8 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 979 ms: Scavenge 262.3 (286.0) -> 261.9 (292.0) MB, 20.3 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1014 ms: Scavenge 268.2 (292.0) -> 267.9 (301.5) MB, 29.8 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1046 ms: Scavenge 277.7 (302.0) -> 277.3 (308.0) MB, 22.4 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1077 ms: Scavenge 283.8 (308.0) -> 283.5 (317.5) MB, 25.1 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1105 ms: Scavenge 293.1 (317.5) -> 292.7 (323.5) MB, 20.7 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1135 ms: Scavenge 299.3 (323.5) -> 299.0 (333.0) MB, 24.9 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1164 ms: Scavenge 308.6 (333.0) -> 308.1 (339.5) MB, 20.9 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1194 ms: Scavenge 314.9 (339.5) -> 314.6 (349.0) MB, 25.0 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1222 ms: Scavenge 324.0 (349.0) -> 323.6 (355.5) MB, 21.1 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1253 ms: Scavenge 330.4 (355.5) -> 330.1 (364.5) MB, 25.1 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1282 ms: Scavenge 339.4 (364.5) -> 339.0 (371.0) MB, 22.2 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1315 ms: Scavenge 346.0 (371.0) -> 345.6 (380.0) MB, 25.8 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1413 ms: Mark-sweep 349.9 (380.0) -> 54.2 (305.0) MB, 5.8 / 0.0 ms (+ 87.5 ms in 73 steps since start of marking, biggest step 8.2 ms, walltime since start of marking 131 ms) finalize incremental marking via stack guard GC in old space requested [20872:0x7f26f24c70d0] 1457 ms: Scavenge 65.8 (305.0) -> 65.1 (305.0) MB, 31.0 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1489 ms: Scavenge 69.9 (305.0) -> 69.7 (305.0) MB, 27.1 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1523 ms: Scavenge 80.9 (305.0) -> 80.4 (305.0) MB, 22.9 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1553 ms: Scavenge 85.5 (305.0) -> 85.3 (305.0) MB, 24.2 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1581 ms: Scavenge 96.3 (305.0) -> 95.7 (305.0) MB, 18.8 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1616 ms: Scavenge 101.1 (305.0) -> 100.9 (305.0) MB, 29.2 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1648 ms: Scavenge 111.6 (305.0) -> 111.1 (305.0) MB, 22.5 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1678 ms: Scavenge 116.7 (305.0) -> 116.5 (305.0) MB, 25.0 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1709 ms: Scavenge 127.0 (305.0) -> 126.5 (305.0) MB, 20.7 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1738 ms: Scavenge 132.3 (305.0) -> 132.1 (305.0) MB, 23.9 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1767 ms: Scavenge 142.4 (305.0) -> 141.9 (305.0) MB, 19.6 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1796 ms: Scavenge 147.9 (305.0) -> 147.7 (305.0) MB, 23.8 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1825 ms: Scavenge 157.8 (305.0) -> 157.3 (305.0) MB, 19.9 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1853 ms: Scavenge 163.5 (305.0) -> 163.2 (305.0) MB, 22.2 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1881 ms: Scavenge 173.2 (305.0) -> 172.7 (305.0) MB, 19.1 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1910 ms: Scavenge 179.1 (305.0) -> 178.8 (305.0) MB, 23.0 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1944 ms: Scavenge 188.6 (305.0) -> 188.1 (305.0) MB, 25.1 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 1979 ms: Scavenge 194.7 (305.0) -> 194.4 (305.0) MB, 28.4 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 2011 ms: Scavenge 204.0 (305.0) -> 203.6 (305.0) MB, 23.4 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 2041 ms: Scavenge 210.2 (305.0) -> 209.9 (305.0) MB, 23.8 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 2074 ms: Scavenge 219.4 (305.0) -> 219.0 (305.0) MB, 24.5 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 2105 ms: Scavenge 225.8 (305.0) -> 225.4 (305.0) MB, 24.7 / 0.0 ms allocation failure [20872:0x7f26f24c70d0] 2138 ms: Scavenge 234.8 (305.0) -> 234.4 (305.0) MB, 23.1 / 0.0 ms allocation failure [...SNIP...] $
: ( ). ,
allocation site pretenuring . (allocation sites), , . , â
pretenure .
$ out/Release/d8 --trace-gc octane-splay.js [20885:0x7ff4d7c220a0] 8 ms: Scavenge 2.7 (6.0) -> 2.6 (7.0) MB, 1.2 / 0.0 ms allocation failure [20885:0x7ff4d7c220a0] 10 ms: Scavenge 2.7 (7.0) -> 2.7 (8.0) MB, 1.6 / 0.0 ms allocation failure [20885:0x7ff4d7c220a0] 11 ms: Scavenge 3.6 (8.0) -> 3.6 (10.0) MB, 0.9 / 0.0 ms allocation failure [20885:0x7ff4d7c220a0] 17 ms: Scavenge 4.8 (10.5) -> 4.7 (11.0) MB, 2.9 / 0.0 ms allocation failure [20885:0x7ff4d7c220a0] 20 ms: Scavenge 5.6 (11.0) -> 5.6 (16.0) MB, 2.8 / 0.0 ms allocation failure [20885:0x7ff4d7c220a0] 26 ms: Scavenge 8.7 (16.0) -> 8.6 (17.0) MB, 4.5 / 0.0 ms allocation failure [20885:0x7ff4d7c220a0] 34 ms: Scavenge 9.6 (17.0) -> 9.5 (28.0) MB, 6.8 / 0.0 ms allocation failure [20885:0x7ff4d7c220a0] 48 ms: Scavenge 16.6 (28.5) -> 16.4 (29.0) MB, 8.6 / 0.0 ms allocation failure [20885:0x7ff4d7c220a0] 64 ms: Scavenge 17.5 (29.0) -> 17.5 (52.0) MB, 15.2 / 0.0 ms allocation failure [20885:0x7ff4d7c220a0] 96 ms: Scavenge 32.3 (52.5) -> 32.0 (53.5) MB, 19.6 / 0.0 ms allocation failure [20885:0x7ff4d7c220a0] 153 ms: Scavenge 61.3 (81.5) -> 57.4 (93.5) MB, 27.9 / 0.0 ms allocation failure [20885:0x7ff4d7c220a0] 432 ms: Scavenge 339.3 (364.5) -> 326.6 (364.5) MB, 12.7 / 0.0 ms allocation failure [20885:0x7ff4d7c220a0] 666 ms: Scavenge 563.7 (592.5) -> 553.3 (595.5) MB, 20.5 / 0.0 ms allocation failure [20885:0x7ff4d7c220a0] 825 ms: Mark-sweep 603.9 (644.0) -> 96.0 (528.0) MB, 4.0 / 0.0 ms (+ 92.5 ms in 51 steps since start of marking, biggest step 4.6 ms, walltime since start of marking 160 ms) finalize incremental marking via stack guard GC in old space requested [20885:0x7ff4d7c220a0] 1068 ms: Scavenge 374.8 (528.0) -> 362.6 (528.0) MB, 19.1 / 0.0 ms allocation failure [20885:0x7ff4d7c220a0] 1304 ms: Mark-sweep 460.1 (528.0) -> 102.5 (444.5) MB, 10.3 / 0.0 ms (+ 117.1 ms in 59 steps since start of marking, biggest step 7.3 ms, walltime since start of marking 200 ms) finalize incremental marking via stack guard GC in old space requested [20885:0x7ff4d7c220a0] 1587 ms: Scavenge 374.2 (444.5) -> 361.6 (444.5) MB, 13.6 / 0.0 ms allocation failure [20885:0x7ff4d7c220a0] 1828 ms: Mark-sweep 485.2 (520.0) -> 101.5 (519.5) MB, 3.4 / 0.0 ms (+ 102.8 ms in 58 steps since start of marking, biggest step 4.5 ms, walltime since start of marking 183 ms) finalize incremental marking via stack guard GC in old space requested [20885:0x7ff4d7c220a0] 2028 ms: Scavenge 371.4 (519.5) -> 358.5 (519.5) MB, 12.1 / 0.0 ms allocation failure [...SNIP...] $
SplayLatency 250 %!
: arewefastyet.com .SIGPLAN , , allocation site pretenuring . , . (
1 ,
2 ,
3 ), allocation site pretenuring . , Ember.js (, - allocation site pretenuring).
allocation site pretenuring, , â , ( - , ). , , , (-) (-) (allocation site)
tenured , . - , , , (incremental marking).
. , ,
Orinoco .
(unified heap), , . : , , . , SplayLatency , . .
(concurrent marking) , (throughput).
ãããã«
, , , - . ,
, , ! , . , , .
: 2016-: Chrome vs. Firefox vs. Edge, venturebeat.com ., â . , JavaScript . , , . , Node.js ( V8, ChakraCore)!

: JavaScript- . , . JavaScript , . Chrome , . , ,
Speedometer , - .
ãããããé¡ãããŸãïŒ