Thomas FuchsãExtreme JavaScript Performanceãï¼JSConf.eu2009ï¼
- JSé«éåããã¼ãã®ãã¬ã¼ã³
- ã¹ãã¼ã«ã¯script.aculo.usã®ã¯ãªã¨ã¼ã¿Thomas Fuchs
- 2009å¹´11æã«éå¬ã®JSConf.euãã
- çºè¡¨æç¹ã§JITã³ã³ãã¤ã©éæè¼ãªOperaã¯ãã³ããã¼ã¯æ¯è¼ããå¤ãã¦ãï¼ieã¯æ¯è¼å¯¾è±¡ã«å ¥ã£ã¦ãï¼
- JITã³ã³ãã¤ã©ã¨Ecmascript5ã®é¢ä¿ã両è ã®é¢ä¿ããå¯è½ã«ãªãjsé«éåtipãã¨ãããã ãã¯é¢ç½ãã£ãã
- è´ãåãç8å²
- jsã§ã¯ã³ã¹ãããããã ãã©ãä»ã®è¨èªã ã¨ãPerlã ã¨ãã»ã»ã»çãªè©±ãããããèãéãã¦ãã
- èãåããå 容å¢ããã追è¨
ã¹ã©ã¤ã
ãã³ããã¼ã¯ã§ä½¿ã£ããã¹ãã³ã¼ã
以ä¸æãèªã¿è´ãããã£ãå 容
aboutãã®ãã¬ã¼ã³
- ããã©ã¼ãã³ã¹æ¹åã«ã¤ãã¦ã®ä¸è¬çãªtipsã¨ããã¤ãä¾ã交ãã¦ç´¹ä»
- ãã©ã¦ã¶ä¸ã§ã®javascriptããã©ã¼ãã³ã¹ã«çµã£ã¦è©±ãã
- javascriptå®è¡ã§ããç°å¢ã¯ãã©ã¦ã¶ã«éããªãï¼ãµã¼ãã¼ãµã¤ãJSã¨ãï¼ã®ã§ä¸å¿æã£ã¦ãã
- ããã£ãã¡ãªæé©åã¯çµ¶å¯¾ãããªãã
- èªåï¼=Thomasï¼ã®ããã©ã¼ãã³ã¹ã¸ã®ã¹ã¿ã³ã¹
- æé©åã¯ãåé¡ãçºçããã¨ãã«ããã¹ã
- å ·ä½çãªããã©ã¼ãã³ã¹ä¸ã®åé¡ããªãã®ã«æãä»ããã¹ããããªã
- ãç¾ç¶åé¡ã«ãªã£ã¦ãªããã©ãå°æ¥åé¡ã«ãªããããããªãï¼ã§ãã©ããã£ã¦è¨ããããå ·ä½çã«æãããªãï¼ãã¨ããæã¯ããã©ã¼ãã³ã¹ã®æé©åã«æãä»ããªããã¨
ãã©ã¦ã¶ä¸ã§ã®javascriptããã©ã¼ãã³ã¹ã¨ãããã¨ã§ã»ã»
- åãã©ã¦ã¶ã®javascriptã¨ã³ã¸ã³ã«ã¤ãã¦ç°¡åã«ç´¹ä»
- Firefox(SpiderMonkey)
- æè¿æãå ¥ã£ã¦æ©ããªã£ã¦ãã¦ã
- Safari(JavaScriptCore)
- ãã
- IE(JScript)
- Chrome(V8)
- ãããgoogleçºããã©ã¦ã¶ãã³ãã¼ã¨ã¯ç¬ç«ãã¦ãã£ã¦ããé¢ç½ãå®è£ ã
- Firefox(SpiderMonkey)
TIPS1ï¼functionææ¸ãã
é¢æ°å¼ã³åºãã³ã¹ããæ¸ããã¦é«éå
//ã½ã¼ã¹ä¾ //æªã function methodCall(){ function square(n){ return n*n }; var i=10000, sum = 0; while(i--â--â) sum += square(i); } //è¯ã function inlinedMethod(){ var i=10000, sum = 0; while(i--â--â) sum += i*i; }
- çµæ
TIPS2ï¼JSã®ç¹é·æ¼ããã¦æ¸ã
- Javaã¨ãCã¨ãä»ã®è¨èªããjsã«å
¥ã£ã人ã¯è¦æ³¨æ
- jsã§ãèªåãå¾æãªè¨èªã¨åãããã«ã³ã¼ããæ¸ããªã
- ãã®ã³ã¼ããjsã®ããã©ã¼ãã³ã¹ã§è¶³ãå¼ã£å¼µããé ãã³ã¼ãã§ããå¯è½æ§ã«é ãå·¡ãããã¹ãã
- jsã§ãèªåãå¾æãªè¨èªã¨åãããã«ã³ã¼ããæ¸ããªã
- newæ¼ç®åã¨parseInt()使ã£ã¦ãã³ã¼ãã®æé©åãä¾ã«
- parseInt()ã¯ãtips1ã¨åãã§é¢æ°ã®å¼ã³åºãã³ã¹ããæ¸ããã¨ãã主æ¨
//newé¿ãã //æªã function classic(){ var a = new Array, o = new Object; } //è¯ã function literals(){ var a = [], o = {}; }
- çµæ
//parseInt()使ããã«å°æ°ç¹ä»¥ä¸åãæ¨ã¦ //before parseInt(12.5); //12 //after ~~(1 * "12.5")//12 //ã1 * æååãã¯è©ä¾¡ãããã¨å°æ°ç¹ã¤ãæ°åã¸å¤æ //jsã§ã¯ããããæ¼ç®åã«ããäºéå¦å®ï¼~~ï¼ã«ãã£ã¦å°æ°ç¹ä»¥ä¸ãåãæ¨ã¦ã§ããããããæ´»ç¨
- ãããæ¼ç®åè¯ãç¥ããªãï¼
- MDCã®Bitwise Operatorsèªã
TIPS3ï¼ã«ã¼ãã®æé©å
- ã«ã¼ããåãã¨ãã«è©ä¾¡ããªãã¨ãããªãå¼ã®æ°ãæ¸ãããã
- ã«ã¼ã使ããªãã§ãã£ã¦ã¿ãã
//before var test = ''; for (var i = 0;i<10000;i++)//æ¯åå¼ã®è©ä¾¡ã3åå ¥ã test = test + str; //after var test = '', i = 10000; while(i--) test = test + str;//æ¯åå¼ã®è©ä¾¡ã¯1åã ã
- çµæ
- ãã®ãã¹ãã§ã¯é度é¢ã®æ¹åã¼ããã ãã©å¼ã®è©ä¾¡ã³ã¹ãã¯æ¸ããã¦ã
//ã«ã¼ãå±éãwhile/for使ããªã //before function normalLoop(){ var i=60, j=0; while(i--â--â) j++; } //after function unrolledLoop(){ var j=0; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; j++; }
TIPS4ï¼ã°ãã¼ãã«ãªãã¸ã§ã¯ãããã£ãã·ã¥ãã
//before function uncached(){ var i = 10000; while(i--) window.test = 'test';//æ¯ã windowãªãã¸ã§ã¯ããåå¾ãã¦ã } //after function cached(){ var w = window, i = 10000;//ã«ã¼ãã®å¤ã§windowãªãã¸ã§ã¯ãããã£ãã·ã¥ while(i--) w.test = 'test'; }
- çµæ
- 1.440s --> 0.825s //firefox
- 0.07s --> 0.07s //safari
- 2.22s 2.19s //ieãå¦çæé1ç§è¶ ãã¦ããã»ã»ã»
- 0.48s --> 0.16s /chrome
- IEé
ã
- æåä¸å¯©ã2ç§ä»¥ä¸ããã£ã¦ããã©ãã¸ã¼è¡¨ç¤ºãåºãªãã
- tips1ãtips2ã®ãã¹ãã§ã¯1ç§è¶ ããã¨å³ãã¸ã¼è¡¨ç¤ºåºã¦ããã©ãåå ããããªãã
é話ä¼é¡ï¼ieã£ã¦å¸¸ã«é ãï¼
- ããã¦ãé ã
- åªãã¦ãé¨åããã
- ieæ£è¦è¡¨ç¾ã¨ã³ã¸ã³ã¯ä»ã¨æ¯ã¹ã¦çµæ§é«é
TIPS5ï¼å¼ï¼expressionï¼ãæé©å
- è«çå¦ã®åæ©çç¥èãæ´»ããã¦å¼ã®è©ä¾¡ã®ã³ã¹ããæ¸ããç³»
- å¼ã®true/falseã確å®ããæç¹ã§å¼ã®æ®ãã®è¦ç´ ã®è©ä¾¡ã¯ã¹ãããããã
//ã¢ã¤ãã£ã¢ç´ æ //bofore var b = false, n = 99; function(){ return n*n && b; //n*nã¨bã©ã¡ããè©ä¾¡ãå¿ è¦ } //after var b = false, n = 99; function(){ return b && n*n;//b //bãfalseã§ããæç¹ã§èªåçã«ãb && n*nãã¯falseãn*nã®è©ä¾¡ã¯ã¹ãããã }
- çµæ
var n = 1; if(true && (n=2)) something(); //ã±ã¼ã¹ï¼ alert(n);//2 if(true || (n=3)) something();//ã±ã¼ã¹ï¼ alert(n);//2ã3ã«ãªããªãã
- ä¸ã®ããã«ãªãããã
- è«çå¼ã®è©ä¾¡ã§ã¯ãå件ï¼å·¦å´ï¼ã®è©ä¾¡ã§å¼å ¨ä½ã®è©ä¾¡ã決ã¾ãå ´åã¯ãå¾ä»¶ï¼å³å´ï¼ã®è©ä¾¡ã¯ã¹ããããããã
- ã±ã¼ã¹ï¼ã§ã¯ãã&&ãã®å·¦å³ãè©ä¾¡ããªãã¨å¼ã®è©ä¾¡ã決ã¾ããªãã®ã§ãnã«2ãã»ãã
- ã±ã¼ã¹ï¼ã§ã¯ãã||ãã®å·¦å´ã®è©ä¾¡ã§ãå¼ã®è©ä¾¡ã決ã¾ããããå³å´ï¼n=3)ã®è©ä¾¡ã¯ã¹ããããããnã«3ãã»ãããããnã¯2ã®ã¾ã¾
TIPS6ï¼ä½¿ãã®ãé¿ããã¹ãç³»
- JITã³ã³ãã¤ã©ã®å®è£ ã«åãããæé©å
- with()ãtryãcatchæ使ããªã
- ieã§ã¯ãã®tip使ã£ã¦ã使ããªãã¦ãå½±é¿ã¼ã
- ie以å¤ã§é«éåããã®ã¯ie以å¤ã§å®è£ æ¸ã®JITã³ã³ãã¤ã©ãwith()ãtryãcatchæããµãã¼ããã¦ãªããã
//with()é¿ãã //before function(){ var obj = { prop: 'test', str: '' }; with(obj){ var i = 10000; while(i--â--â) str += prop; return str; } //after } function(){ var obj = { prop: 'test', str: '' }, i = 10000; while(i--â--â) obj.str += obj.prop; return obj.str; }
- çµæ
//tryãcatché¿ãã //before var a = 0; function(){ try{ a += 1; } catch(e) {} } //after function(){ a += 1; }
- çµæ
- ã©ããã¦ããããçµæï¼
- ie以å¤ã®ã¢ãã³ãã©ã¦ã¶ã§with()ã¨tryãcatchæãé¿ããã¨é«éå
- fx/safari/chromeã®JITã³ã³ãã¤ã©ã®å®è£
ãåå
- JITã³ã³ãã¤ã©ã®å®è£ ã¯ãECMAScript5ï¼ECMA-262ï¼ã®ãstrict modeãã¸æºæ
- ecmascript5ã®strict modeã§with()ã¯ãµãã¼ãå¤ã
- John Resigããã®è¾ºã«ã¤ãã¦ã¯ããè¨äºï¼ECMAScript 5 Strict Mode, JSON, and Moreï¼æ¸ãã¦ãããèªã
ãã¾ãï¼ã¾ãã«javascriptã¨ã³ã¸ã³ã¯ã½ã¼ã¹ã³ã¼ããæ¸ãæãã¦ãå ´åãã
é¢æ°ã®ã½ã¼ã¹ã³ã¼ããåå¾ããã
//æ®éãããããã //ã ãã¯ãã¹ãã©ã¦ã¶ãããªã //firefoxããã¡ (function(){...}).toString(); //ãããã (function () { return 2 * 3; }).toString(); //ãã¹ãããã¨ãããªã function () { return 2 * 3; } //safariãOK function () { return 2 * 3; } //ieãOK function () { return 2 * 3; } //chromeãOK function () { return 6; } //firefoxãNG //解決æ¹æ³ãalertæã§è¡¨ç¤ºããããã¨ã alert((function () { return "alert((" + arguments.callee.toString().replace(/\s/g, "") + ")());"; })());
- ãã©ã¦ã¶ãå é¨çã«jsã½ã¼ã¹ãæ¸ãæããã±ã¼ã¹ãç¨ã«ããã
- ãããããã©ã¦ã¶ã®æ¯ãèãã¯ãã³ããã¼ã¯æ¸ãã¨ãã«æ°ã«ããã»ããããã
質çå¿çãã
- ãã³ããã¼ã¯ã®æ¸¬å®æ¹æ³
- jsã§æ¸¬ã£ã¦ããã©ãDateãªãã¸ã§ã¯ãã¨getTime()使ã£ã¦ãã ã
- ãã®ãã¬ã¼ã³ã§ä½¿ã£ã¦ããã³ããã¼ã¯ç¨ã®é¢æ°ã¯ï¼ã¤ã ãã¨ãèªåãæ¸ããæ¬ã ã¨ãã³ããã¼ã¯ç¨ã®é¢æ°ã¯è¤æ°ç´¹ä»ãã¦ãã2åç®ã®å¼ã³åºãæéã調ã¹ãã¨ããã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ç®¡çã®æ´»ç¨ã¨ããåãããã¤æ¸ããã
- ããã©ã¼ãã³ã¹æé©åããã¨ãã«ããªããã½ãã使ã£ã¦ãï¼
è£è¶³ï¼2009å¹´ã®JSConf.euãä»ã®ãã¬ã¼ã³
- JSConf.eu on blip.tv
- 2009å¹´JSConf.euã®ä»ã®ã¹ãã¼ã«ã®åç»ã
- 豪è¯ã¹ãã¼ã«ãRyan Dahl(node.jsï¼ãDouglas CrockfordãSteve SoudersãJohn Resigãetc..
- Steve Soudersãéãã¯ããã©ã«ãã
- Faruk AtesãHTML5/CSS3æ代ã®JSã
- Christophe PorteneuveãSprocketsã
- Railsãããããprototype.jsã®éçºãã¼ã ã®1人ãããªã¸ã£ã³
- ã¦ã§ãã¢ããªã§è¥å¤§åä¸æ¹ã®jsãã¡ã¤ã«ç¾¤ã管çããRuby製ã®ãã¼ã«Sprocketsã®ç´¹ä»
- ã¹ã©ã¤ã
- Francisco TolmaskyãBuilding Desktop-Caliber Web Apps With Cappuccino and Atlasã
- Robert NymanãJavaScript - From Birth to Closureã
- Douglas CrockfordãJSã®ç¾å¨ï¼æªæ¥ã
- Remy SharpãHTML5 JavaScript APIsã
- Malte UblãA Meta Object System for JavaScriptã
- Alois ReitbauerãTracing JS Performanceã
- Alexander LangãCouchDB使ã£ã¦ã¤ãããã®ã¦ã§ãã¢ããªä½ãã
- Dion Almaerãã¦ã§ãã¢ããªã®æªæ¥ã
- 2010å¹´2æã«éçºä¸æ¢ããgearsã®è©±ãå¤ãã
- Ryan DahlãNode.jsã
- Joh ResigãUnderstanding JavaScript Testingã