![ç»å](https://habrastorage.org/getpro/habr/post_images/a99/0aa/d96/a990aad96e82fa731e5709d47bfd3b81.jpg)
ããããã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>
䜿çšãæªéãšã®ãã³ã¹ã§ãªããªããã¯ã©ã€ã¢ã³ãåŽã§ã®èšç®ã®å®è¡ãå¯èœã«ãªã£ãã ãã§ãªãã奚å±ãããŸããã
![](https://habrastorage.org/files/c91/f24/a80/c91f24a8027b49729e8d454f9b98bb00.png)
åºå žïŒ V8ããã³Web Assemblyã䜿çšããé«åºŠãªJSããã©ãŒãã³ã¹ ãChrome Developer Summit 2016ã @ s3ththompson
2016幎ã«ã¯ããã¹ãŠã®ïŒéèŠãªïŒ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ãå«ãïŒãå€§å¹ ã«æ¹åãããããšã¯ã»ãšãã©ãããŸããã
![](https://habrastorage.org/files/f85/88c/462/f8588c4626e54dab82ae91e7aab07928.png)
åºå žïŒ Real-World JavaScript Performance ãBlinkOn 6 Conferenceã @ tverwaes
JetStreamãšOctaneã®ææ°ããŒãžã§ã³ãå«ãJavaScriptããã©ãŒãã³ã¹ã枬å®ããããã®åŸæ¥ã®ãã³ãããŒã¯ã®ãã¹ãŠãæ代é ãã«ãªã£ãŠããããã«ãªã£ãããšããŸããŸãæããã«ãªã£ãããããããã¡ã€ãªã³ã°ãšV8ããã³Chromeçšã®æ°ããã€ã³ã¿ãŒã»ãã¿ãŒãè¿œå ããŠãå®éã®ã¢ããªã±ãŒã·ã§ã³ã枬å®ããæ°ããæ¹æ³ãæ¢ãå§ããŸãããã¬ãŒã¹ã ãŸããã¹ã¯ãªããã®å®è¡ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãã³ã³ãã€ã«ãªã©ããµã€ãã®é²èŠ§ã«ããå€ãã®æéãè²»ããããšãç解ããããã«ããŒã«ã䜿çšããŸããã ç 究çµæã¯éåžžã«èå³æ·±ããäºæ³å€ã§ããã åã®å³ãããããããã«ãOctaneãèµ·åãããšã70ïŒ ä»¥äžã®æéãJavaScriptãšã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã«è²»ããããŸãããJavaScriptã䜿çšãããµã€ãã®é²èŠ§ã«ãããæéã¯åžžã«30ïŒ æªæºã§ãããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã«ãããæéã¯5ïŒ ä»¥äžã§ãã ãããã解æãšã³ã³ãã€ã«ã«ã¯å€ãã®æéãããããOctaneã«ã€ããŠã¯èšããŸããã ãã®ãããJavaScriptã®å®è¡ãæé©åããããã®çžåœãªåªåã«ãããOctaneã®ãªãŠã ãå€§å¹ ã«å¢å ããŸããããµã€ãã®èªã¿èŸŒã¿ã¯ããã»ã©éããããŸããã ããã«ãJavaScriptã®å®è¡ãæé©åãã趣å³ã¯ãã³ã³ãã€ã«ã«æéãããããããå®éã®ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæãªãå¯èœæ§ããããŸãããŸãã¯ãã³ã³ãã€ã«ãICãã©ã³ã¿ã€ã ãæ¡åŒµããè¿œå ã®ãã©ã¡ãŒã¿ãŒã远跡ããå¿ èŠããããŸãã
![](https://habrastorage.org/files/f65/f5d/485/f65f5d485ad841b3b2959878ca40eb33.png)
JavaScript ã DOMãå«ãããã©ãŠã¶å šäœã®ããã©ãŒãã³ã¹ã枬å®ããããšããå¥ã®ãã³ãããŒã¯ããã±ãŒãžããããŸãïŒ Speedometer ã 圌ã¯ãããŸããŸãªäººæ°ã®ããWebãã¬ãŒã ã¯ãŒã¯ã«å®è£ ãããã·ã³ãã«ãªTodoMVCã¢ããªã±ãŒã·ã§ã³ãèµ·åããããšã§ãããçŸå®çã«æž¬å®ã«ã¢ãããŒãããããšããŸãïŒä»æ¥ã¯å°ãæ代é ãã§ãããæ°ããããŒãžã§ã³ããã§ã«äœæãããŠããŸãïŒã ããã±ãŒãžã«ã¯ãæ°ãããã¹ãïŒè§åºŠããšã³ããŒãåå¿ãããã©ããã©ã€ããããã¯ããŒã³ïŒãå«ãŸããŠããŸãã ä»æ¥ãŸã§ãã¹ããŒãã¡ãŒã¿ãŒã¯å®éã®ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã枬å®ããããã®æã奜ãŸãããããã·ã®åœ¹å²ã®ããã§ãã ãã ããããã¯2016幎åã°ã®ããŒã¿ã§ãããWebã§äœ¿çšããããã¿ãŒã³ãéçºããããšããã¹ãŠãæ¢ã«å€æŽãããå¯èœæ§ãããããšã«æ³šæããŠãã ããïŒããšãã°ãICã·ã¹ãã ããªãã¡ã¯ã¿ãªã³ã°ããŠã³ã¹ããå€§å¹ ã«åæžããããŒãµãŒãåèšèšããŸã ïŒã äžèšã®ç¶æ³ã¯ãµã€ãã®é²èŠ§ã«ã®ã¿é¢ä¿ããŠããããã§ãããå®éã®Node.jsã¢ããªã±ãŒã·ã§ã³ã®å ŽåãåŸæ¥ã®ããŒã¯ããã©ãŒãã³ã¹ã®ãã³ãããŒã¯ã¯ãããã·ããŒã«ã«å¯ŸããŠããŸãããŸãæ©èœããªããšããéåžžã«èª¬åŸåã®ãã蚌æ ãåãåããŸããã
![](https://habrastorage.org/files/16d/fc4/42a/16dfc442aa1342e4b9a643f3a4821ff5.png)
åºå žïŒ Real-World JavaScript Performance ãBlinkOn 6 Conferenceã @ tverwaes
ããããããã¯ãã¹ãŠå¹ åºãèªè ã«ãã§ã«ç¥ãããŠããã®ã§ãJSã³ãã¥ããã£ãæçšã§ããçç±ã説æããããã€ãã®å ·äœçãªäŸã ããåãäžããŸãããããæç¹ã§ããŒã¯ããã©ãŒãã³ã¹ã®éçãã³ãããŒã¯ã«æ³šæãæããªãããšãéåžžã«éèŠã§ãã JSãšã³ãžã³ãã©ã®ããã«ãã³ãããŒã¯ã«åæ Œããå®éã«ã©ã®ããã«ãããè¡ããã®äŸããå§ããŸãããã
æªåé«ãSunSpiderã®äŸ
åŸæ¥ã®JSãã³ãããŒã¯ã«é¢ããèšäºã¯ãSunSpiderã®æãããªåé¡ã«ã€ããŠèšåããŠããªããã°äžå®å šã§ãã å®éã®ç¶æ³ã§ã®é©çšæ§ãå¶éãããŠããããã©ãŒãã³ã¹ãã¹ãã bitops-bitwise-and.jsããå§ããŸãããã
![](https://habrastorage.org/files/5bf/986/bcf/5bf986bcf3ab46048a21a914fcee0355.png)
ç¹ã«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ïŒ ãŸã§ïŒã
![](https://habrastorage.org/files/c5e/354/987/c5e354987aee47949da8266c8f6cad68.png)
ããèŠãŠã¿ãŸãããïŒ
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ã«é²ã¿ãŸãããã ãã®ãã³ãããŒã¯ã¯ãå€ãã®è¡åæŒç®ãå®è¡ããŸããããã«ãããæãã€ã³ããªãžã§ã³ããªã³ã³ãã€ã©ãŒã§ãããåã«å®è¡ããããšããã§ããŸããã ãã³ãããŒã¯ã¯ãã«ãŒãé¢æ°ãšãããåŒã³åºãé¢æ°ã®å®è¡ã«å€ãã®æéãè²»ãããŸãã
![](https://habrastorage.org/files/b80/c69/f00/b80c69f000c649299c0b67d1ca1bcabe.png)
èå³æ·±ã芳å¯ïŒé¢æ°
RotateX
ã
RotateY
RotateZ
åžžã«å®æ°ãã©ã¡ãŒã¿ãŒ
Phi
åŒã³åºãããŸãã
![](https://habrastorage.org/files/2c0/1eb/fa1/2c01ebfa1b9b48d3ba01232852524d6f.png)
ããã¯ã Math.sinãšMath.cosã«å¯ŸããŠåžžã«204ååãå€ãèšç®ããããšãæå³ããŸãã å ¥åå€ã¯3ã€ã®ã¿ã§ãã
- 0.017453292519943295
- 0.05235987755982989
- 0,08726646259971647
åãæ£åŒŠå€ãšäœåŒŠå€ã®äžå¿ èŠãªèšç®ãé¿ããããã«ã以åã«èšç®ãããå€ããã£ãã·ã¥ã§ããŸãã 以åã¯ãV8ã¯ãŸãã«ãããè¡ããŸããããä»ã®ãã¹ãŠã®ãšã³ãžã³ã¯ãŸã ããããŠããŸãã V8ããè¶ è¶ãã£ãã·ã¥ãšåŒã°ãããã®ãåé€ããŸãããããã¯ãé£ç¶ããåãå€ãåžžã«èšç®ãããšã¯éããªããšãã«ãå®éã®è² è·ã®äžã§åé·æ§ãé¡èã ã£ãããã§ãã SunSpiderãã³ãããŒã¯ã®çµæã§å€ã倱æãããã®ç¹å®ã®æé©åãåé€ããŸãããããã³ãããŒã¯çšã«æé©åãããšåæã«ãå®éã®ãããžã§ã¯ãã®çµæãæªåãããããšã¯æå³ããªããšç¢ºä¿¡ããŠããŸãã
![](https://habrastorage.org/files/1de/195/80a/1de19580ab5d424e9ded99e087cbb13b.png)
ãœãŒã¹ïŒ arewefastyet.com
æããã«ããã®ãããªå®æ°ã䜿çšããæè¯ã®æ¹æ³-å ¥åæ£åŒŠ/äœåŒŠ-ã¯ãéåžžã®ã€ã³ã©ã€ã³ãã¥ãŒãªã¹ãã£ãã¯ãã¥ãŒãªã¹ãã£ãã¯ã§ããããã¯ã眮æã®ãã©ã³ã¹ãåããå®æ°ãã©ãŒã«ãã£ã³ã°ãæçšãªå Žåã«åŒã³åºããã€ã³ãã§ã®çœ®æèšå®ãªã©ã®ããŸããŸãªèŠå ãèæ ®ããããšããŸãïŒå®æ°ãã©ãŒã«ãã£ã³ã°ïŒïŒ
RotateX
ã
RotateY
ã
RotateZ
ã®å Žåãš
RotateZ
ïŒã ããããããã€ãã®çç±ãããããã¯ã¯ã©ã³ã¯ã·ã£ããã³ã³ãã€ã©ã«ã¯é©ããŠããŸããã§ããã ãã ããããã¯Ignitionããã³TurboFanã®å Žåã®åççãªãªãã·ã§ã³ã§ããã代æ¿ãã¥ãŒãªã¹ãã£ãã¯ã®æ¹åã«æ¢ã«åãçµãã§ããŸãã
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¯æ害ãšèŠãªãããŸã
ç¹å®ã®ã±ãŒã¹ã«å ããŠãSunSpiderã«ã¯å¥ã®åºæ¬çãªåé¡ããããŸããããã¯ãåèšå®è¡æéã§ãã çŸåšãé©åãªIntelããŒããŠã§ã¢ã§ã¯ãV8ãšã³ãžã³ã¯çŽ200ããªç§ã§ãã³ãããŒã¯å šäœãå®è¡ããŸãïŒæ°ããã¹ããŒã¹ã®çããŠãããªããžã§ã¯ããšå€ãã¹ããŒã¹ã®æçåã«äŸåããŸãïŒããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®äž»èŠãªäžæåæ¢ã¯ç°¡åã«30ããªç§ã«éããŸãã ãŸããã€ã³ã¯ãªã¡ã³ã¿ã«ããŒãã³ã°ã®ã³ã¹ãã¯èæ ®ãããŠããŸãããããã¯ãSunSpiderããã±ãŒãžã®åèšå®è¡æéã®10ïŒ ä»¥äžã§ãã ãããã£ãŠãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®ããã«ãšã³ãžã³ã®é床ã10ã20ïŒ äœäžããããªãå Žåã¯ãSunSpiderã®å®è¡äžã«ãšã³ãžã³ãéå§ãããªãããã«ããå¿ èŠããããŸãã
![](https://habrastorage.org/files/c17/381/1d3/c173811d3efb48d29870804e248904a9.png)
ãã®ããã«ãããŸããŸãªããªãã¯ã䜿çšãããŸãããããããã¹ãŠã¯ãç§ãç¥ãéããå®éã®ã¿ã¹ã¯ã«ãã©ã¹ã®å¹æã¯ãããŸããã V8ã¯ãããè¡ããŸãïŒåSunSpiderãã¹ãã¯ãæ°ãããã€ãã£ãã³ã³ããã¹ãã«å¯Ÿå¿ããæ°ãã
<iframe>
ã§å®è¡ãããããã
<iframe>
ã®äœæãšé 眮ãç»é²ããã ãã§ãïŒåSunSpiderãã¹ãã«è²»ããæéã¯50ããªç§æªæºã§ãïŒã ãããŠããã¹ãäžã§ã¯ãªããé 眮æé ãšäœææé ã®éã§ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãå®è¡ãããŸãã ãã®ããªãã¯ã¯ããŸãæ©èœãã99.99ïŒ ã®ã±ãŒã¹ã§ã¯å®éã®ãããžã§ã¯ãã«ã¯åœ±é¿ããŸããã ããããV8ãã¢ããªã±ãŒã·ã§ã³ãSunSpiderãã¹ãã®ããã«èŠãããšå€æããå Žåãã¬ããŒãžã³ã¬ã¯ã¿ãŒã匷å¶çã«å®è¡ããããããäœæ¥é床ã«æªåœ±é¿ãåãŒããŸãã ãããã£ãŠãã¢ããªã±ãŒã·ã§ã³ãSunSpiderã®ããã«èŠããªãã§ãã ãã ã
SunSpiderã«é¢é£ããä»ã®äŸãæããããšã¯ã§ããŸããã圹ã«ç«ã€ãšã¯æããŸããã åªããããã©ãŒãã³ã¹ã®çµæãäžåãããã«SunSpiderãæé©åããããšã¯ãå®éã®ã¢ããªã±ãŒã·ã§ã³ã«ã¯æå³ããªãããšã¯ããã§ã«æããã§ããããšãé¡ã£ãŠããŸãã ãšã³ãžã³ã¯ãã®ããã±ãŒãžã«ã®ã¿æçšã§ãå®éã®ç¶æ³ã§ã¯æ害ã«ãªãå¯èœæ§ã®ããå¥åŠãªããã¯ã䜿çšã§ãããããSunSpiderããããªãã£ããäžçã¯æ©æµãåãããšæããŸãã
æ®å¿µãªãããèšè ããã©ãŠã¶ã®ããã©ãŒãã³ã¹ãã©ã®ããã«èããŠããããæ¯èŒãããšããSunSpiderã¯äŸç¶ãšããŠãã¹ã³ãã§éåžžã«é »ç¹ã«äœ¿çšãããŠããŸãã ãŸãã¯ãããã«æªãããšã«ãã¹ããŒããã©ã³ãæ¯èŒããŸãïŒ ãã¡ãããã¡ãŒã«ãŒã®é¢å¿ãããã«ç€ºãããŠããŸãã Androidãã£ã³ãã¯ãChromeãSunSpiderïŒããã³ãã®ä»ã®ç¡æå³ãªãã³ãããŒã¯ïŒã§è¯å¥œãªçµæã瀺ãããšãéèŠã§ãã ã¹ããŒããã©ã³ã¡ãŒã«ãŒã¯è£œåã販売ããããšã§çšŒãå¿ èŠããããããã«ã¯è¯ãã¬ãã¥ãŒãå¿ èŠã§ãã äžéšã®äŒæ¥ã¯ãV8ã®å€ãããŒãžã§ã³ãã¹ããŒããã©ã³ã«æèŒããŠåºè·ããŠãããããSunSpiderã§ããè¯ãçµæã瀺ããŠããŸãã ãã®çµæããŠãŒã¶ãŒã¯éããããŠããªãã»ãã¥ãªãã£ããŒã«ã«é¥ããŸãããããã¯åŸã®ããŒãžã§ã³ã§ä¿®æ£ãããŠããŸãã ããã«ãå®éã«ã¯V8ã®å€ãããŒãžã§ã³ã¯ããé ãåäœããŸãïŒ
![](https://habrastorage.org/files/3fe/11a/bde/3fe11abdea434892832cf57d6a76bacc.png)
åºå žïŒGalaxy S7ããã³S7 Edgeã®ã¬ãã¥ãŒïŒãµã ã¹ã³ã®æé«ã®æè¡ãããã«ç£šãäžããwww.engadget.com
JavaScriptã³ãã¥ããã£ã客芳çãªããã©ãŒãã³ã¹ããŒã¿ãååŸããããšã«æ¬åœã«é¢å¿ãããå Žåããžã£ãŒããªã¹ãããã©ãŠã¶ãŒãšã¹ããŒããã©ã³ãæ¯èŒãããšãã«åŸæ¥ã®ãã³ãããŒã¯ã®äœ¿çšãåæ¢ããå¿ èŠããããŸãã åãã©ãŠã¶ã§ãã³ãããŒã¯ãå®è¡ããååŸããæ°å€ãæ¯èŒããæ¹ãç°¡åã§ããããšãç解ããŠããŸããããã®å Žåã¯ãã©ãããåãåãããã ããã -å°ãªããšãäœããã®åœ¢ã§çŸåšã®ç¶æ³ã«å¯Ÿå¿ãããã³ãããŒã¯ã«æ³šæããŠãã ããã ãããæ¬åœã®ãŠã§ãããŒãžã§ãã ãã©ãŠã¶ã®ãã³ãããŒã¯ã§2å°ã®ã¹ããŒããã©ã³ãæ¯èŒããå¿ èŠãããå Žåã¯ãå°ãªããšãSpeedometerã䜿çšããŠãã ãã ã
ã¯ã©ãŒã±ã³ãšã®ããã»ã©æçœã§ãªãç¶æ³
Krakenãã³ãããŒã¯ã¯ã2010幎9æã«Mozillaã«ãã£ãŠãªãªãŒã¹ãããŸãã ã ã³ãŒãã®æçãšå®éã®ã¢ããªã±ãŒã·ã§ã³ã®ã³ã¢ãå«ãŸããŠãããšäž»åŒµãããŸããã ã¯ã©ãŒã±ã³ã¯ãSunSpiderãOctaneã»ã©JavaScriptã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããŠããªããããããŸãæéããããŸããã audio-oscillator.jsãã¹ãã®äŸã®ã¿ã説æããŸãã
![](https://habrastorage.org/files/2c0/dc4/d8c/2c0dc4d8c9414b0485b79d763b20a320.png)
ãã¹ãã¯500åã
calcOsc
é¢æ°ãåŒã³åºããŸãã æåã«ã
sine Oscillator
ã°ããŒãã«ã«å¯ŸããŠ
generate
ãåŒã³åºãã次ã«æ°ãã
Oscillator
äœæããããã«å¯ŸããŠgenerateãåŒã³åºããŠãããã
sine Oscillator
è¿œå ããŸãã ããã§ãããè¡ãããçç±ã«ã€ããŠè©³ããã¯èª¬æããŸãããã
Oscillator
ãããã¿ã€ãã®
generate
ã¡ãœãããèŠãŠã¿ãŸãããã
![](https://habrastorage.org/files/586/413/4b6/5864134b622f4ca584e2927917409d50.png)
ã³ãŒããèŠããšã倧éšåã®æéã¯é åãžã®ã¢ã¯ã»ã¹ãä¹ç®ããŸãã¯Math.roundã®åŸªç°åŒã³åºãã§å ããããŠãããšæ³å®ã§ããŸãã runtime
Oscillator.prototype.generate
offset % this.waveTableLength
. Intel-, , 20 %
idiv
, (modulus). :
waveTableLength
Oscillator 2048,
Oscillator
.
![](https://habrastorage.org/files/baf/6f5/3d0/baf6f53d0200454abed51b8c851d6028.png)
, â , 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).
![](https://habrastorage.org/files/0f8/e55/e99/0f8e55e99c9a4343b4cdb04576fbf6aa.png)
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.toStringTagL
. - ToPrimitive (
m
,hint Number
). - OrdinaryToPrimitive (
m
,"number"
), Symbol.toPrimitive. -
m.valueOf()
, m, Object.prototype.valueOf . -
m.toString()
,"[object Object]"
, Object.prototype.toString , Symbol.toStringTagL
. -
"[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
:
![](https://habrastorage.org/files/0df/be3/876/0dfbe38765c64110a23f6020a9de3bd2.png)
:
![](https://habrastorage.org/files/e04/26d/1ed/e0426d1edfb2468ca79304b17e047455.png)
: , . , , , JS- . , ! , ( ,
true
false
, ). , , . ES2015, , (ES2015 â !).
Mandreel. C/C++ JavaScript. asm.js , Emscripten , ( ). Octane Bullet , Mandreel . MandreelLatency, . , Mandreel , . , . , . , .
![](https://habrastorage.org/files/49a/34b/b3a/49a34bb3ad5540cc82747f4f7fc0dd62.png)
Mandreel
global_init
, . , ( ), , , ( ). V8 . , , , .
global_init
Mandreel , + + .
global_init
, .
![](https://habrastorage.org/files/58e/f8f/201/58ef8f2018cf48eda10205a801a9a354.png)
: arewefastyet.com .
global_init
, 200- . , , , , ( ).
, â splay.js . , (splay trees) ( ). : . (buckets) , . ! çè«çã«ã¯ã , :
![](https://habrastorage.org/files/7c7/06b/340/7c706b34029347ca9cb501ac203082c4.png)
, , , , 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 %!
![](https://habrastorage.org/files/815/3a4/be2/8153a4be251f499c9e556386e0f2cfce.png)
: 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).
ãããã«
, , , - . , , , ! , . , , .
![](https://habrastorage.org/files/789/4e1/c57/7894e1c57b0c4a3fb1709caa9ba54f22.png)
: 2016-: Chrome vs. Firefox vs. Edge, venturebeat.com .
, â . , JavaScript . , , . , Node.js ( V8, ChakraCore)!
![](https://habrastorage.org/files/84f/829/88d/84f82988d085483dbf6e99ee1dd9b7e6.jpg)
: JavaScript- . , . JavaScript , . Chrome , . , , Speedometer , - .
ãããããé¡ãããŸãïŒ