ºÜ¶àJavaScriptÒýÇæ£¬ÈçGoogleµÄV8ÒýÇæ£¨±»ChromeºÍNodeËùÓã©£¬ÊÇרÃÅΪÐèÒª¿ìËÙÖ´ÐеĴóÐÍJavaScriptÓ¦ÓÃËùÉè¼ÆµÄ¡£Èç¹ûÄãÊÇÒ»¸ö¿ª·¢Õߣ¬²¢ÇÒ¹ØÐÄÄÚ´æÊ¹ÓÃÇé¿öÓëÒ³ÃæÐÔÄÜ£¬ÄãÓ¦¸ÃÁ˽âÓû§ä¯ÀÀÆ÷ÖеÄJavaScriptÒýÇæÊÇÈçºÎÔË×÷µÄ¡£ÎÞÂÛÊÇV8£¬SpiderMonkeyµÄ£¨Firefox£©µÄCarakan£¨Opera£©£¬Chakra£¨IE£©»òÆäËûÒýÇæ£¬ÕâÑù×ö¿ÉÒÔ°ïÖúÄã¸üºÃµØÓÅ»¯ÄãµÄÓ¦ÓóÌÐò¡£Õâ²¢²»ÊÇ˵Ӧ¸ÃרÃÅΪijһä¯ÀÀÆ÷»òÒýÇæ×öÓÅ»¯£¬Ç§Íò±ðÕâô×ö¡£
µ«ÊÇ£¬ÄãÓ¦¸ÃÎÊ×Ô¼º¼¸¸öÎÊÌ⣺
1.ÔÚÎҵĴúÂëÀÊÇ·ñ¿ÉÒÔʹ´úÂë¸ü¸ßЧһЩ
2.Ö÷Á÷µÄJavaScriptÒýÇæ¶¼×öÁËÄÄЩÓÅ»¯
3.ʲôÊÇÒýÇæÎÞ·¨ÓÅ»¯µÄ£¬À¬»ø»ØÊÕÆ÷£¨GC£©ÊÇ·ñÄÜ»ØÊÕÎÒËùÆÚÍûµÄ¶«Î÷

¼ÓÔØ¿ìËÙµÄÍøÕ¾¾ÍÏñÊÇÒ»Á¾¿ìËÙµÄÅܳµ£¬ÐèÒªÓõ½Ìرð¶¨ÖƵÄÁã¼þ. ͼƬÀ´Ô´: dHybridcars.
±àд¸ßÐÔÄÜ´úÂëʱÓÐһЩ³£¼ûµÄÏÝÚ壬ÔÚÕâÆªÎÄÕÂÖУ¬ÎÒÃǽ«Õ¹Ê¾Ò»Ð©¾¹ýÑéÖ¤µÄ¡¢¸üºÃµÄ±àд´úÂ뷽ʽ¡£
ÄÇô£¬JavaScriptÔÚV8ÀïÊÇÈçºÎ¹¤×÷µÄ£¿
Èç¹ûÄã¶ÔJSÒýÇæÃ»ÓнÏÉîµÄÁ˽⣬¿ª·¢Ò»¸ö´óÐÍWebÓ¦ÓÃҲûɶÎÊÌ⣬¾ÍºÃ±È»á¿ª³µµÄÈËÒ²Ö»ÊÇ¿´¹ýÒýÇæ¸Ç¶øÃ»Óп´¹ý³µ¸ÇÄÚµÄÒýÇæÒ»Ñù¡£¼øÓÚChromeÊÇÎÒµÄä¯ÀÀÆ÷Ê×Ñ¡£¬ËùÒÔ̸һÏÂËüµÄJavaScriptÒýÇæ¡£V8ÊÇÓÉÒÔϼ¸¸öºËÐIJ¿·Ö×é³É£º
1.Ò»¸ö»ù±¾µÄ±àÒëÆ÷£¬Ëü»áÔÚ´úÂëÖ´ÐÐǰ½âÎöJavaScript´úÂë²¢Éú³É±¾µØ»úÆ÷Â룬¶ø²»ÊÇÖ´ÐÐ×Ö½ÚÂë»ò¼òµ¥µØ½âÊÍËü¡£ÕâЩ´úÂë×ʼ²¢²»ÊǸ߶ÈÓÅ»¯µÄ¡£
2.V8½«¶ÔÏó¹¹½¨Îª¶ÔÏóÄ£ÐÍ¡£ÔÚJavaScriptÖжÔÏó±íÏÖΪ¹ØÁªÊý×飬µ«ÊÇÔÚV8ÖжÔÏ󱻿´×÷ÊÇÒþ²ØµÄÀ࣬һ¸öΪÁËÓÅ»¯²éѯµÄÄÚ²¿ÀàÐÍϵͳ¡£
3.ÔËÐÐʱ·ÖÎöÆ÷¼àÊÓÕýÔÚÔËÐеÄϵͳ£¬²¢±êʶÁË¡°hot¡±µÄº¯Êý£¨ÀýÈ绨·ÑºÜ³¤Ê±¼äÔËÐеĴúÂ룩¡£
4.ÓÅ»¯±àÒëÆ÷ÖØÐ±àÒëºÍÓÅ»¯ÄÇЩ±»ÔËÐÐʱ·ÖÎöÆ÷±êʶΪ¡°hot¡±µÄ´úÂ룬²¢½øÐС°ÄÚÁª¡±µÈÓÅ»¯£¨ÀýÈçÓñ»µ÷ÓÃÕßµÄÖ÷ÌåÌæ»»º¯Êýµ÷ÓõÄλÖã©¡£
5.V8Ö§³ÖÈ¥ÓÅ»¯£¬ÕâÒâζ×ÅÓÅ»¯±àÒëÆ÷Èç¹û·¢ÏÖ¶ÔÓÚ´úÂëÓÅ»¯µÄ¼ÙÉè¹ýÓÚÀÖ¹Û£¬Ëü»áÉáÆúÓÅ»¯¹ýµÄ´úÂë¡£
6.V8ÓиöÀ¬»øÊÕ¼¯Æ÷£¬Á˽âËüÊÇÈçºÎ¹¤×÷µÄºÍÓÅ»¯JavaScriptÒ»ÑùÖØÒª¡£
À¬»ø»ØÊÕ
À¬»ø»ØÊÕÊÇÄÚ´æ¹ÜÀíµÄÒ»ÖÖÐÎʽ£¬Æäʵ¾ÍÊÇÒ»¸öÊÕ¼¯Æ÷µÄ¸ÅÄ³¢ÊÔ»ØÊÕ²»ÔÙ±»Ê¹ÓõĶÔÏóËùÕ¼ÓõÄÄÚ´æ¡£ÔÚJavaScriptÕâÖÖÀ¬»ø»ØÊÕÓïÑÔÖУ¬Ó¦ÓóÌÐòÖÐÈÔÔÚ±»ÒýÓõĶÔÏ󲻻ᱻÇå³ý¡£
ÊÖ¶¯Ïû³ý¶ÔÏóÒýÓÃÔÚ´ó¶àÊýÇé¿öÏÂÊÇûÓбØÒªµÄ¡£Í¨¹ý¼òµ¥µØ°Ñ±äÁ¿·ÅÔÚÐèÒªËüÃǵĵط½£¨ÀíÏëÇé¿öÏ£¬¾¡¿ÉÄÜÊǾֲ¿×÷ÓÃÓò£¬¼´ËüÃDZ»Ê¹Óõĺ¯ÊýÀï¶ø²»ÊǺ¯ÊýÍâ²ã£©£¬Ò»Çн«ÔË×÷µØºÜºÃ¡£

À¬»ø»ØÊÕÆ÷³¢ÊÔ»ØÊÕÄÚ´æ. ͼƬÀ´Ô´: Valtteri
M?ki.
ÔÚJavaScriptÖУ¬ÊDz»¿ÉÄÜÇ¿ÖÆ½øÐÐÀ¬»ø»ØÊյġ£Äã²»Ó¦¸ÃÕâô×ö£¬ÒòΪÀ¬»øÊÕ¼¯¹ý³ÌÊÇÓÉÔËÐÐʱ¿ØÖƵģ¬ËüÖªµÀʲôÊÇ×îºÃµÄÇåÀíʱ»ú¡£
¡°Ïû³ýÒýÓá±µÄÎó½â
ÍøÉÏÓÐÐí¶à¹ØÓÚJavaScriptÄÚ´æ»ØÊÕµÄÌÖÂÛ¶¼Ì¸µ½deleteÕâ¸ö¹Ø¼ü×Ö£¬ËäÈ»Ëü¿ÉÒÔ±»ÓÃÀ´É¾³ý¶ÔÏó£¨map£©ÖеÄÊôÐÔ£¨key£©£¬µ«Óв¿·Ö¿ª·¢ÕßÈÏΪËü¿ÉÒÔÓÃÀ´Ç¿ÖÆ¡°Ïû³ýÒýÓᱡ£½¨Ò龡¿ÉÄܱÜÃâʹÓÃdelete£¬ÔÚÏÂÃæµÄÀý×ÓÖÐdelete
o.x µÄ±×´óÓÚÀû£¬ÒòΪËü¸Ä±äÁËoµÄÒþ²ØÀ࣬²¢Ê¹Ëü³ÉΪһ¸ö"Âý¶ÔÏó"¡£
var o = { x: 1 }; delete o.x; // true o.x; // undefined |
Äã»áºÜÈÝÒ×µØÔÚÁ÷ÐеÄJS¿âÖÐÕÒµ½ÒýÓÃɾ³ý¡ª¡ªÕâÊǾßÓÐÓïÑÔÄ¿µÄÐԵġ£ÕâÀïÐèҪעÒâµÄÊDZÜÃâÔÚÔËÐÐʱÐ޸ġ±hot¡±¶ÔÏóµÄ½á¹¹¡£JavaScriptÒýÇæ¿ÉÒÔ¼ì²â³öÕâÖÖ¡°hot¡±µÄ¶ÔÏ󣬲¢³¢ÊÔ¶ÔÆä½øÐÐÓÅ»¯¡£Èç¹û¶ÔÏóÔÚÉúÃüÖÜÆÚÖÐÆä½á¹¹Ã»ÓнϴóµÄ¸Ä±ä£¬ÒýÇæ½«»á¸üÈÝÒ×ÓÅ»¯¶ÔÏ󣬶ødelete²Ù×÷ʵ¼ÊÉϻᴥ·¢ÕâÖֽϴóµÄ½á¹¹¸Ä±ä£¬Òò´Ë²»ÀûÓÚÒýÇæµÄÓÅ»¯¡£
¶ÔÓÚnullÊÇÈçºÎ¹¤×÷Ò²ÊÇÓÐÎó½âµÄ¡£½«Ò»¸ö¶ÔÏóÒýÓÃÉèÖÃΪnull£¬²¢Ã»ÓÐʹ¶ÔÏó±ä¡°¿Õ¡±£¬Ö»Êǽ«ËüµÄÒýÓÃÉèÖÃΪ¿Õ¶øÒÑ¡£Ê¹ÓÃo.x=
null±ÈʹÓÃdelete»á¸üºÃЩ£¬µ«¿ÉÄÜÒ²²»ÊǺܱØÒª¡£
var o = { x: 1 }; o = null; o; // null o.x // TypeError |
Èç¹û´ËÒýÓÃÊǵ±Ç°¶ÔÏóµÄ×îºóÒýÓã¬ÄÇô¸Ã¶ÔÏ󽫱»×÷ΪÀ¬»ø»ØÊÕ¡£Èç¹û´ËÒýÓò»Êǵ±Ç°¶ÔÏóµÄ×îºóÒýÓã¬Ôò¸Ã¶ÔÏóÊǿɷÃÎʵÄÇÒ²»»á±»À¬»ø»ØÊÕ¡£
ÁíÍâÐèҪעÒâµÄÊÇ£¬È«¾Ö±äÁ¿ÔÚÒ³ÃæµÄÉúÃüÖÜÆÚÀïÊDz»±»À¬»ø»ØÊÕÆ÷ÇåÀíµÄ¡£ÎÞÂÛÒ³Ãæ´ò¿ª¶à¾Ã£¬JavaScriptÔËÐÐʱȫ¾Ö¶ÔÏó×÷ÓÃÓòÖеıäÁ¿»áÒ»Ö±´æÔÚ¡£
var myGlobalNamespace = {}; |
È«¾Ö¶ÔÏóÖ»»áÔÚË¢ÐÂÒ³Ãæ¡¢µ¼º½µ½ÆäËûÒ³Ãæ¡¢¹Ø±Õ±êǩҳ»òÍ˳öä¯ÀÀÆ÷ʱ²Å»á±»ÇåÀí¡£º¯Êý×÷ÓÃÓòµÄ±äÁ¿½«ÔÚ³¬³ö×÷ÓÃÓòʱ±»ÇåÀí£¬¼´Í˳öº¯Êýʱ£¬ÒѾûÓÐÈκÎÒýÓã¬ÕâÑùµÄ±äÁ¿¾Í±»ÇåÀíÁË¡£
¾Ñé·¨Ôò
ΪÁËʹÀ¬»ø»ØÊÕÆ÷¾¡ÔçÊÕ¼¯¾¡¿ÉÄܶàµÄ¶ÔÏ󣬲»Òªhold×Ų»ÔÙʹÓõĶÔÏó¡£ÕâÀïÓм¸¼þÊÂÐèÒª¼Çס£º
ÕýÈçÇ°ÃæÌáµ½µÄ£¬ÔÚºÏÊʵķ¶Î§ÄÚʹÓñäÁ¿ÊÇÊÖ¶¯Ïû³ýÒýÓõĸüºÃÑ¡Ôñ¡£¼´Ò»¸ö±äÁ¿Ö»ÔÚÒ»¸öº¯Êý×÷ÓÃÓòÖÐʹÓ㬾Ͳ»ÒªÔÚÈ«¾Ö×÷ÓÃÓòÉùÃ÷Ëü¡£ÕâÒâζןü¸É¾»Ê¡ÐĵĴúÂë¡£
È·±£½â°óÄÇЩ²»ÔÙÐèÒªµÄʼþ¼àÌýÆ÷£¬ÓÈÆäÊÇÄÇЩ¼´½«±»Ïú»ÙµÄDOM¶ÔÏóËù°ó¶¨µÄʼþ¼àÌýÆ÷¡£
Èç¹ûʹÓõÄÊý¾Ý»º´æÔÚ±¾µØ£¬È·±£ÇåÀíһϻº´æ»òʹÓÃÀÏ»¯»úÖÆ£¬ÒÔ±ÜÃâ´óÁ¿²»±»ÖØÓõÄÊý¾Ý±»´æ´¢¡£
º¯Êý
½ÓÏÂÀ´£¬ÎÒÃÇ̸̸º¯Êý¡£ÕýÈçÎÒÃÇÒѾ˵¹ý£¬À¬»øÊÕ¼¯µÄ¹¤×÷ÔÀí£¬ÊÇͨ¹ý»ØÊÕ²»ÔÙÊÇ·ÃÎʵÄÄÚ´æ¿é£¨¶ÔÏ󣩡£ÎªÁ˸üºÃµØËµÃ÷ÕâÒ»µã£¬ÕâÀïÓÐһЩÀý×Ó¡£
function foo() { var bar = new LargeObject(); bar.someCall(); } |
µ±foo·µ»ØÊ±£¬barÖ¸ÏòµÄ¶ÔÏ󽫻ᱻÀ¬»øÊÕ¼¯Æ÷×Ô¶¯»ØÊÕ£¬ÒòΪËüÒÑûÓÐÈκδæÔÚµÄÒýÓÃÁË¡£
¶Ô±Èһϣº
function foo() { var bar = new LargeObject(); bar.someCall(); return bar; } // somewhere else var b = foo(); |
ÏÖÔÚÎÒÃÇÓÐÒ»¸öÒýÓÃÖ¸Ïòbar¶ÔÏó£¬ÕâÑùbar¶ÔÏóµÄÉú´æÖÜÆÚ¾Í´ÓfooµÄµ÷ÓÃÒ»Ö±³ÖÐøµ½µ÷ÓÃÕßÖ¸¶¨±ðµÄ±äÁ¿b£¨»òb³¬³ö·¶Î§£©¡£
±Õ°ü£¨CLOSURES£©
µ±Äã¿´µ½Ò»¸öº¯Êý£¬·µ»ØÒ»¸öÄÚ²¿º¯Êý£¬¸ÃÄÚ²¿º¯Êý½«»ñµÃ·¶Î§ÍâµÄ·ÃÎÊȨ£¬¼´Ê¹ÔÚÍⲿº¯ÊýÖ´ÐÐÖ®ºó¡£ÕâÊÇÒ»¸ö»ù±¾µÄ±Õ°ü
¡ª¡ª ¿ÉÒÔÔÚÌØ¶¨µÄÉÏÏÂÎÄÖÐÉèÖõıäÁ¿µÄ±í´ïʽ¡£ÀýÈ磺
function sum (x) { function sumIt(y) { return x + y; }; return sumIt; } // Usage var sumA = sum(4); var sumB = sumA(3); console.log(sumB); // Returns 7 |
ÔÚsumµ÷ÓÃÉÏÏÂÎÄÖÐÉú³ÉµÄº¯Êý¶ÔÏó£¨sumIt£©ÊÇÎÞ·¨±»»ØÊյģ¬Ëü±»È«¾Ö±äÁ¿£¨sumA£©ËùÒýÓ㬲¢ÇÒ¿ÉÒÔͨ¹ýsumA(n)µ÷Óá£
ÈÃÎÒÃÇÀ´¿´¿´ÁíÍâÒ»¸öÀý×Ó£¬ÕâÀïÎÒÃÇ¿ÉÒÔ·ÃÎʱäÁ¿largeStrÂð£¿
var a = function () { var largeStr = new Array(1000000).join('x'); return function () { return largeStr; }; }(); |
Êǵģ¬ÎÒÃÇ¿ÉÒÔͨ¹ýa()·ÃÎÊlargeStr£¬ËùÒÔËüûÓб»»ØÊÕ¡£ÏÂÃæÕâ¸öÄØ£¿
var a = function () { var smallStr = 'x'; var largeStr = new Array(1000000).join('x'); return function (n) { return smallStr; }; }(); |
ÎÒÃDz»ÄÜÔÙ·ÃÎÊlargeStrÁË£¬ËüÒѾÊÇÀ¬»ø»ØÊÕºòÑ¡ÈËÁË¡£¡¾ÒëÕß×¢£ºÒòΪlargeStrÒѲ»´æÔÚÍⲿÒýÓÃÁË¡¿
¶¨Ê±Æ÷
×îÔãµÄÄÚ´æÐ¹Â©µØ·½Ö®Ò»ÊÇÔÚÑ»·ÖУ¬»òÕßÔÚsetTimeout()/ setInterval()ÖУ¬µ«ÕâÊÇÏ൱³£¼ûµÄ¡£Ë¼¿¼ÏÂÃæµÄÀý×Ó:
var myObj = { callMeMaybe: function () { var myRef = this; var val = setTimeout(function () { console.log('Time is running out!'); myRef.callMeMaybe(); }, 1000); } }; |
Èç¹ûÎÒÃÇÔËÐÐmyObj.callMeMaybe();À´Æô¶¯¶¨Ê±Æ÷£¬¿ÉÒÔ¿´µ½¿ØÖÆÌ¨Ã¿Ãë´òÓ¡³ö¡°Time
is running out!¡±¡£Èç¹û½Ó×ÅÔËÐÐmyObj = null£¬¶¨Ê±Æ÷ÒÀ¾É´¦ÓÚ¼¤»î״̬¡£ÎªÁËÄܹ»³ÖÐøÖ´ÐУ¬±Õ°ü½«myObj´«µÝ¸øsetTimeout£¬ÕâÑùmyObjÊÇÎÞ·¨±»»ØÊյġ£Ïà·´£¬ËüÒýÓõ½myObjµÄÒòΪËü²¶»ñÁËmyRef¡£Õâ¸úÎÒÃÇΪÁ˱£³ÖÒýÓý«±Õ°ü´«¸øÆäËûµÄº¯ÊýÊÇÒ»ÑùµÄ¡£
ͬÑùÖµµÃÀμǵÄÊÇ£¬setTimeout/setIntervalµ÷ÓÃ(È纯Êý)ÖеÄÒýÓ㬽«ÐèÒªÖ´ÐкÍÍê³É£¬²Å¿ÉÒÔ±»À¬»øÊÕ¼¯¡£
µ±ÐÄÐÔÄÜÏÝÚå
ÓÀÔ¶²»ÒªÓÅ»¯´úÂ룬ֱµ½ÄãÕæÕýÐèÒª¡£ÏÖÔÚ¾³£¿ÉÒÔ¿´µ½Ò»Ð©»ù×¼²âÊÔ£¬ÏÔʾN±ÈMÔÚV8ÖиüΪÓÅ»¯£¬µ«ÊÇÔÚÄ£¿é´úÂë»òÓ¦ÓÃÖвâÊÔһϻᷢÏÖ£¬ÕâЩÓÅ»¯ÕæÕýµÄЧ¹û±ÈÄãÆÚÍûµÄҪСµÄ¶à¡£

×öµÄ¹ý¶à»¹²»Èçʲô¶¼²»×ö. ͼƬÀ´Ô´: Tim
Sheerman-Chase.
±ÈÈçÎÒÃÇÏëÒª´´½¨ÕâÑùÒ»¸öÄ£¿é£º
1.ÐèÒªÒ»¸ö±¾µØµÄÊý¾ÝÔ´°üº¬Êý×ÖID
2.»æÖưüº¬ÕâЩÊý¾ÝµÄ±í¸ñ
3.Ìí¼Óʼþ´¦Àí³ÌÐò£¬µ±Óû§µã»÷µÄÈκε¥Ôª¸ñʱÇл»µ¥Ôª¸ñµÄcss class
Õâ¸öÎÊÌâÓм¸¸ö²»Í¬µÄÒòËØ£¬ËäȻҲºÜÈÝÒ×½â¾ö¡£ÎÒÃÇÈçºÎ´æ´¢Êý¾Ý£¬ÈçºÎ¸ßЧµØ»æÖƱí¸ñ²¢ÇÒappendµ½DOMÖУ¬ÈçºÎ¸üÓŵش¦Àí±í¸ñʼþ£¿
Ãæ¶ÔÕâЩÎÊÌâ×ʼ£¨ÌìÕæ£©µÄ×ö·¨ÊÇʹÓöÔÏó´æ´¢Êý¾Ý²¢·ÅÈëÊý×éÖУ¬Ê¹ÓÃjQuery±éÀúÊý¾Ý»æÖƱí¸ñ²¢appendµ½DOMÖУ¬×îºóʹÓÃʼþ°ó¶¨ÎÒÃÇÆÚÍûµØµã»÷ÐÐΪ¡£
×¢Ò⣺Õâ²»ÊÇÄãÓ¦¸Ã×öµÄ
var moduleA = function () { return { data: dataArrayObject, init: function () { this.addTable(); this.addEvents(); }, addTable: function () { for (var i = 0; i < rows; i++) { $tr = $('<tr></tr>'); for (var j = 0; j < this.data.length; j++) { $tr.append('<td>' + this.data[j]['id'] + '</td>'); } $tr.appendTo($tbody); } }, addEvents: function () { $('table td').on('click', function () { $(this).toggleClass('active'); }); } }; }(); |
Õâ¶Î´úÂë¼òµ¥ÓÐЧµØÍê³ÉÁËÈÎÎñ¡£
µ«ÔÚÕâÖÖÇé¿öÏ£¬ÎÒÃDZéÀúµÄÊý¾ÝÖ»ÊDZ¾Ó¦¸Ã¼òµ¥µØ´æ·ÅÔÚÊý×éÖеÄÊý×ÖÐÍÊôÐÔID¡£ÓÐȤµÄÊÇ£¬Ö±½ÓʹÓÃDocumentFragmentºÍ±¾µØDOM·½·¨±ÈʹÓÃjQuery£¨ÒÔÕâÖÖ·½Ê½£©À´Éú³É±í¸ñÊǸüÓŵÄÑ¡Ôñ£¬µ±È»£¬Ê¼þ´úÀí±Èµ¥¶À°ó¶¨Ã¿¸ötd¾ßÓиü¸ßµÄÐÔÄÜ¡£
ҪעÒâËäÈ»jQueryÔÚÄÚ²¿Ê¹ÓÃDocumentFragment£¬µ«ÊÇÔÚÎÒÃǵÄÀý×ÓÖУ¬´úÂëÔÚÑ»·ÄÚµ÷ÓÃappend²¢ÇÒÕâЩµ÷ÓÃÉæ¼°µ½Ò»Ð©ÆäËûµÄС֪ʶ£¬Òò´ËÔÚÕâÀïÆðµ½µÄÓÅ»¯×÷Óò»´ó¡£Ï£ÍûÕâ²»»áÊÇÒ»¸öÍ´µã£¬µ«ÇëÎñ±Ø½øÐлù×¼²âÊÔ£¬ÒÔÈ·±£×Ô¼º´úÂëok¡£
¶ÔÓÚÎÒÃǵÄÀý×Ó£¬ÉÏÊöµÄ×ö·¨´øÀ´ÁË£¨ÆÚÍûµÄ£©ÐÔÄÜÌáÉý¡£Ê¼þ´úÀí¶Ô¼òµ¥µÄ°ó¶¨ÊÇÒ»ÖָĽø£¬¿ÉÑ¡µÄDocumentFragmentÒ²Æðµ½ÁËÖúÍÆ×÷Óá£
var moduleD = function () { return { data: dataArray, init: function () { this.addTable(); this.addEvents(); }, addTable: function () { var td, tr; var frag = document.createDocumentFragment(); var frag2 = document.createDocumentFragment(); for (var i = 0; i < rows; i++) { tr = document.createElement('tr'); for (var j = 0; j < this.data.length; j++) { td = document.createElement('td'); td.appendChild(document.createTextNode(this.data[j])); frag2.appendChild(td); } tr.appendChild(frag2); frag.appendChild(tr); } tbody.appendChild(frag); }, addEvents: function () { $('table').on('click', 'td', function () { $(this).toggleClass('active'); }); } }; }(); |
½ÓÏÂÀ´¿´¿´ÆäËûÌáÉýÐÔÄܵķ½Ê½¡£ÄãÒ²ÐíÔø¾ÔÚÄĶÁµ½¹ýʹÓÃÔÐÍģʽ±ÈÄ£¿éģʽ¸üÓÅ£¬»òÌý˵¹ýʹÓÃJSÄ£°æ¿ò¼ÜÐÔÄܸüºÃ¡£ÓÐʱµÄÈ·Èç´Ë£¬²»¹ýʹÓÃËüÃÇÆäʵÊÇΪÁË´úÂë¸ü¾ß¿É¶ÁÐÔ¡£¶ÔÁË£¬»¹ÓÐÔ¤±àÒ룡ÈÃÎÒÃÇ¿´¿´ÔÚʵ¼ùÖбíÏÖµÄÈçºÎ£¿
moduleG = function () {}; moduleG.prototype.data = dataArray; moduleG.prototype.init = function () { this.addTable(); this.addEvents(); }; moduleG.prototype.addTable = function () { var template = _.template($('#template').text()); var html = template({'data' : this.data}); $tbody.append(html); }; moduleG.prototype.addEvents = function () { $('table').on('click', 'td', function () { $(this).toggleClass('active'); }); }; var modG = new moduleG(); |
ÊÂʵ֤Ã÷£¬ÔÚÕâÖÖÇé¿öϵĴøÀ´µÄÐÔÄÜÌáÉý¿ÉÒÔºöÂÔ²»¼Æ¡£Ä£°åºÍÔÐ͵ÄÑ¡Ôñ²¢Ã»ÓÐÕæÕýÌṩ¸ü¶àµÄ¶«Î÷¡£Ò²¾ÍÊÇ˵£¬ÐÔÄܲ¢²»ÊÇ¿ª·¢ÕßʹÓÃËüÃǵÄÔÒò£¬¸ø´úÂë´øÀ´µÄ¿É¶ÁÐÔ¡¢¼Ì³ÐÄ£ÐͺͿÉά»¤ÐÔ²ÅÊÇÕæÕýµÄÔÒò¡£
¸ü¸´ÔÓµÄÎÊÌâ°üÀ¨¸ßЧµØÔÚcanvasÉÏ»æÖÆÍ¼Æ¬ºÍ²Ù×÷´ø»ò²»´øÀàÐÍÊý×éµÄÏñËØÊý¾Ý¡£
ÔÚ½«Ò»Ð©·½·¨ÓÃÔÚÄã×Ô¼ºµÄÓ¦ÓÃ֮ǰ£¬Ò»¶¨Òª¶àÁ˽âÕâЩ·½°¸µÄ»ù×¼²âÊÔ¡£Ò²ÐíÓÐÈË»¹¼ÇµÃJSÄ£°æµÄshoot-offºÍËæºóµÄÀ©Õ¹°æ¡£ÄãÒª¸ãÇå³þ»ù×¼²âÊÔ²»ÊÇ´æÔÚÓÚÄã¿´²»µ½µÄÄÇЩÐéÄâÓ¦Ó㬶øÊÇÓ¦¸ÃÔÚÄãµÄʵ¼Ê´úÂëÖÐÈ¥²âÊÔ´øÀ´µÄÓÅ»¯¡£
V8ÓÅ»¯¼¼ÇÉ
Ïêϸ½éÉÜÁËÿ¸öV8ÒýÇæµÄÓÅ»¯µãÔÚ±¾ÎÄÌÖÂÛ·¶Î§Ö®Í⣬µ±È»ÕâÀïÒ²ÓÐÐí¶àÖµµÃÒ»ÌáµÄ¼¼ÇÉ¡£¼ÇסÕâЩ¼¼ÇÉÄã¾ÍÄܼõÉÙÄÇЩÐÔÄܵÍϵĴúÂëÁË¡£
ÌØ¶¨Ä£Ê½¿ÉÒÔʹV8°ÚÍÑÓÅ»¯µÄÀ§¾³£¬±ÈÈç˵try-catch¡£ÓûÁ˽â¸ü¶àÓйØÄÄЩº¯ÊýÄÜ»ò²»ÄܽøÐÐÓÅ»¯£¬Äã¿ÉÒÔÔÚV8µÄ½Å±¾¹¤¾ßd8ÖÐʹÓèCtrace-opt
file.jsÃüÁî¡£
Èç¹ûÄã¹ØÐÄËÙ¶È£¬¾¡Á¿Ê¹ÄãµÄº¯ÊýÖ°Ôðµ¥Ò»£¬¼´È·±£±äÁ¿£¨°üÀ¨ÊôÐÔ£¬Êý×飬º¯Êý²ÎÊý£©Ö»Ê¹ÓÃÏàͬÒþ²ØÀà°üº¬µÄ¶ÔÏó¡£¾Ù¸öÀý×Ó£¬±ðÕâô¸É£º
function add(x, y) { return x+y; } add(1, 2); add('a','b'); add(my_custom_object, undefined); |
²»Òª¼ÓÔØÎ´³õʼ»¯»òÒÑɾ³ýµÄÔªËØ¡£Èç¹ûÕâô×öÒ²²»»á³öÏÖʲô´íÎ󣬵«ÊÇÕâÑù»áʹËٶȱäÂý¡£
²»ÒªÊ¹º¯ÊýÌå¹ý´ó£¬ÕâÑù»áʹµÃÓÅ»¯¸ü¼ÓÀ§ÄÑ¡£
¸ü¶àÄÚÈÝ¿ÉÒÔÈ¥¿´Daniel CliffordÔÚGoogle I/OµÄ·ÖÏí Breaking the
JavaScript Speed Limit with V8¡£ Optimizing For V8 ¡ª
A SeriesÒ²·Ç³£ÖµµÃÒ»¶Á¡£
¶ÔÏóVSÊý×飺ÎÒÓ¦¸ÃÓÃÄĸö£¿
Èç¹ûÄãÏë´æ´¢Ò»´®Êý×Ö£¬»òÕßһЩÏàͬÀàÐ͵ĶÔÏó£¬Ê¹ÓÃÒ»¸öÊý×é¡£
Èç¹ûÄãÓïÒåÉÏÐèÒªµÄÊÇÒ»¶ÑµÄ¶ÔÏóµÄÊôÐÔ£¨²»Í¬ÀàÐ͵ģ©£¬Ê¹ÓÃÒ»¸ö¶ÔÏóºÍÊôÐÔ¡£ÕâÔÚÄÚ´æ·½Ãæ·Ç³£¸ßЧ£¬ËÙ¶ÈÒ²Ï൱¿ì¡£
ÕûÊýË÷ÒýµÄÔªËØ£¬ÎÞÂÛ´æ´¢ÔÚÒ»¸öÊý×é»ò¶ÔÏóÖУ¬¶¼Òª±È±éÀú¶ÔÏóµÄÊôÐÔ¿ìµÃ¶à¡£
¶ÔÏóµÄÊôÐԱȽϸ´ÔÓ£ºËüÃÇ¿ÉÒÔ±»setterÃÇ´´½¨£¬¾ßÓв»Í¬µÄö¾ÙÐԺͿÉдÐÔ¡£Êý×éÖÐÔò²»¾ßÓÐÈç´ËµÄ¶¨ÖÆÐÔ£¬¶øÖ»´æÔÚÓкÍÎÞÕâÁ½ÖÖ״̬¡£ÔÚÒýÇæ²ãÃæ£¬ÕâÔÊÐí¸ü¶à´æ´¢½á¹¹·½ÃæµÄÓÅ»¯¡£ÌرðÊǵ±Êý×éÖдæÔÚÊý×Öʱ£¬ÀýÈçµ±ÄãÐèÒªÈÝÆ÷ʱ£¬²»Óö¨Òå¾ßÓÐx,y,zÊôÐÔµÄÀ࣬¶øÖ»ÓÃÊý×é¾Í¿ÉÒÔÁË¡£
JavaScriptÖжÔÏóºÍÊý×éÖ®¼äÖ»ÓÐÒ»¸öµÄÖ÷񻂿±ð£¬ÄǾÍÊÇÊý×éÉñÆæµÄlengthÊôÐÔ¡£Èç¹ûÄã×Ô¼ºÀ´Î¬»¤Õâ¸öÊôÐÔ£¬ÄÇôV8ÖжÔÏóºÍÊý×éµÄËÙ¶ÈÊÇÒ»Ñù¿ìµÄ¡£
ʹÓöÔÏóʱµÄ¼¼ÇÉ
ʹÓÃÒ»¸ö¹¹Ô캯ÊýÀ´´´½¨¶ÔÏó¡£Õ⽫ȷ±£Ëü´´½¨µÄËùÓжÔÏó¾ßÓÐÏàͬµÄÒþ²ØÀ࣬²¢ÓÐÖúÓÚ±ÜÃâ¸ü¸ÄÕâЩÀà¡£×÷Ϊһ¸ö¶îÍâµÄºÃ´¦£¬ËüÒ²ÂÔ¿ìÓÚObject.create()
ÄãµÄÓ¦ÓÃÖУ¬¶ÔÓÚʹÓò»Í¬ÀàÐ͵ĶÔÏóºÍÆä¸´ÔÓ¶È£¨ÔÚºÏÀíµÄ·¶Î§ÄÚ£º³¤ÔÐÍÁ´ÍùÍùÊÇÓк¦µÄ£¬³ÊÏÖÖ»ÓÐÒ»¸ö¼«ÉÙÊýÊôÐԵĶÔÏó±È´ó¶ÔÏó»á¿ìÒ»µã£©ÊÇÓÐûÏÞÖÆµÄ¡£¶ÔÓÚ¡°hot¡±¶ÔÏ󣬾¡Á¿±£³Ö¶ÌÔÐÍÁ´£¬²¢ÇÒÉÙÊôÐÔ¡£
¶ÔÏó¿Ë¡
¶ÔÓÚÓ¦ÓóÌÐò¿ª·¢ÈËÔ±£¬¶ÔÏó¿Ë¡ÊÇÒ»¸ö³£¼ûµÄÎÊÌâ¡£ËäÈ»¸÷ÖÖ»ù×¼²âÊÔ¿ÉÒÔÖ¤Ã÷V8¶ÔÕâ¸öÎÊÌâ´¦ÀíµÃºÜºÃ£¬µ«ÈÔҪСÐÄ¡£¸´ÖÆ´óµÄ¶«Î÷ͨ³£ÊǽÏÂýµÄ¡ª¡ª²»ÒªÕâô×ö¡£JSÖеÄfor..inÑ»·ÓÈÆäÔã¸â£¬ÒòΪËüÓÐ×Ŷñħ°ãµÄ¹æ·¶£¬²¢ÇÒÎÞÂÛÊÇÔÚÄĸöÒýÇæÖУ¬¶¼¿ÉÄÜÓÀÔ¶²»»á±ÈÈκζÔÏó¿ì¡£
µ±ÄãÒ»¶¨ÒªÔڹؼüÐÔÄÜ´úÂë·¾¶Éϸ´ÖƶÔÏóʱ£¬Ê¹ÓÃÊý×é»òÒ»¸ö×Ô¶¨ÒåµÄ¡°¿½±´¹¹Ô캯Êý¡±¹¦ÄÜÃ÷È·µØ¸´ÖÆÃ¿¸öÊôÐÔ¡£Õâ¿ÉÄÜÊÇ×î¿ìµÄ·½Ê½£º
function clone(original) { this.foo = original.foo; this.bar = original.bar; } var copy = new clone(original); |
Ä£¿éģʽÖлº´æº¯Êý
ʹÓÃÄ£¿éģʽʱ»º´æº¯Êý£¬¿ÉÄܻᵼÖÂÐÔÄÜ·½ÃæµÄÌáÉý¡£²ÎÔÄÏÂÃæµÄÀý×Ó£¬ÒòΪËü×ÜÊÇ´´½¨³ÉÔ±º¯ÊýµÄи±±¾£¬Äã¿´µ½µÄ±ä»¯¿ÉÄÜ»á±È½ÏÂý¡£
ÁíÍâÇë×¢Ò⣬ʹÓÃÕâÖÖ·½·¨Ã÷ÏÔ¸üÓÅ£¬²»½ö½öÊÇÒÀ¿¿ÔÐÍģʽ£¨¾¹ýjsPerf²âÊÔÈ·ÈÏ£©¡£

ʹÓÃÄ£¿éģʽ»òÔÐÍģʽʱµÄÐÔÄÜÌáÉý
ÕâÊÇÒ»¸öÔÐÍģʽÓëÄ£¿éģʽµÄÐÔÄܶԱȲâÊÔ£º
// Prototypal pattern Klass1 = function () {} Klass1.prototype.foo = function () { log('foo'); } Klass1.prototype.bar = function () { log('bar'); } // Module pattern Klass2 = function () { var foo = function () { log('foo'); }, bar = function () { log('bar'); }; return { foo: foo, bar: bar } } // Module pattern with cached functions var FooFunction = function () { log('foo'); }; var BarFunction = function () { log('bar'); }; Klass3 = function () { return { foo: FooFunction, bar: BarFunction } } // Iteration tests // Prototypal var i = 1000, objs = []; while (i--) { var o = new Klass1() objs.push(new Klass1()); o.bar; o.foo; } // Module pattern var i = 1000, objs = []; while (i--) { var o = Klass2() objs.push(Klass2()); o.bar; o.foo; } // Module pattern with cached functions var i = 1000, objs = []; while (i--) { var o = Klass3() objs.push(Klass3()); o.bar; o.foo; } // See the test for full details |
ʹÓÃÊý×éʱµÄ¼¼ÇÉ
½ÓÏÂÀ´ËµËµÊý×éÏà¹ØµÄ¼¼ÇÉ¡£ÔÚÒ»°ãÇé¿öÏ£¬²»ÒªÉ¾³ýÊý×éÔªËØ£¬ÕâÑù½«Ê¹Êý×é¹ý¶Éµ½½ÏÂýµÄÄÚ²¿±íʾ¡£µ±Ë÷Òý±äµÃÏ¡Ê裬V8½«»áÊ¹ÔªËØ×ªÎª¸üÂýµÄ×Öµäģʽ¡£
Êý×é×ÖÃæÁ¿
Êý×é×ÖÃæÁ¿·Ç³£ÓÐÓã¬Ëü¿ÉÒÔ°µÊ¾VMÊý×éµÄ´óСºÍÀàÐÍ¡£Ëüͨ³£ÓÃÔÚÌå»ý²»´óµÄÊý×éÖС£
// Here V8 can see that you want a 4-element array containing numbers: var a = [1, 2, 3, 4]; // Don't do this: a = []; // Here V8 knows nothing about the array for(var i = 1; i <= 4; i++) { a.push(i); } |
´æ´¢µ¥Ò»ÀàÐÍVS¶àÀàÐÍ
½«»ìºÏÀàÐÍ£¨±ÈÈçÊý×Ö¡¢×Ö·û´®¡¢undefined¡¢true/false£©µÄÊý¾Ý´æÔÚÊý×éÖоø²»ÊÇÒ»¸öºÃÏë·¨¡£ÀýÈçvar
arr = [1, ¡°1¡±, undefined, true, ¡°true¡±]
1.ÀàÐÍÍÆ¶ÏµÄÐÔÄܲâÊÔ
ÕýÈçÎÒÃÇËù¿´µ½µÄ½á¹û£¬ÕûÊýµÄÊý×éÊÇ×î¿ìµÄ¡£
Ï¡ÊèÊý×éÓëÂúÊý×é
µ±ÄãʹÓÃÏ¡ÊèÊý×éʱ£¬Òª×¢Òâ·ÃÎÊÔªËØ½«Ô¶Ô¶ÂýÓÚÂúÊý×é¡£ÒòΪV8²»»á·ÖÅäÒ»Õû¿é¿Õ¼ä¸øÖ»Óõ½²¿·Ö¿Õ¼äµÄÊý×顣ȡ¶ø´úÖ®µÄÊÇ£¬Ëü±»¹ÜÀíÔÚ×ÖµäÖУ¬¼È½ÚÔ¼Á˿ռ䣬µ«»¨·Ñ·ÃÎʵÄʱ¼ä¡£
2.Ï¡ÊèÊý×éÓëÂúÊý×éµÄ²âÊÔ
Ô¤·ÖÅä¿Õ¼äVS¶¯Ì¬·ÖÅä
²»ÒªÔ¤·ÖÅä´óÊý×飨Èç´óÓÚ64KµÄÔªËØ£©£¬Æä×î´óµÄ´óС£¬¶øÓ¦¸Ã¶¯Ì¬·ÖÅä¡£ÔÚÎÒÃÇÕâÆªÎÄÕµÄÐÔÄܲâÊÔ֮ǰ£¬Çë¼ÇסÕâÖ»ÊÊÓò¿·ÖJavaScriptÒýÇæ¡£

¿Õ×ÖÃæÁ¿ÓëÔ¤·ÖÅäÊý×éÔÚ²»Í¬µÄä¯ÀÀÆ÷½øÐвâÊÔ
Nitro (Safari)¶ÔÔ¤·ÖÅäµÄÊý×é¸üÓÐÀû¡£¶øÔÚÆäËûÒýÇæ£¨V8£¬SpiderMonkey£©ÖУ¬Ô¤ÏÈ·ÖÅä²¢²»ÊǸßЧµÄ¡£
3.Ô¤·ÖÅäÊý×é²âÊÔ
// Empty array var arr = []; for (var i = 0; i < 1000000; i++) { arr[i] = i; } // Pre-allocated array var arr = new Array(1000000); for (var i = 0; i < 1000000; i++) { arr[i] = i; } |
ÓÅ»¯ÄãµÄÓ¦ÓÃ
ÔÚWebÓ¦ÓõÄÊÀ½çÖУ¬ËٶȾÍÊÇÒ»ÇС£Ã»ÓÐÓû§Ï£ÍûÓÃÒ»¸öÒª»¨¼¸ÃëÖÓ¼ÆËãijÁÐ×ÜÊý»ò»¨¼¸·ÖÖÓ»ã×ÜÐÅÏ¢µÄ±í¸ñÓ¦Óá£ÕâÊÇΪʲôÄãÒªÔÚ´úÂëÖÐѹեÿһµãÐÔÄܵÄÖØÒªÔÒò¡£

ͼƬÀ´Ô´: Per Olof Forsberg.
Àí½âºÍÌá¸ßÓ¦ÓóÌÐòµÄÐÔÄÜÊǷdz£ÓÐÓõÄͬʱ£¬ËüÒ²ÊÇÀ§Äѵġ£ÎÒÃÇÍÆ¼öÒÔϵIJ½ÖèÀ´½â¾öÐÔÄܵÄÍ´µã£º
1.²âÁ¿£ºÔÚÄúµÄÓ¦ÓóÌÐòÖÐÕÒµ½ÂýµÄµØ·½£¨Ô¼45£¥£©
2.Àí½â£ºÕÒ³öʵ¼ÊµÄÎÊÌâÊÇʲô£¨Ô¼45£¥£©
3.ÐÞ¸´Ëü£¡ £¨Ô¼10£¥£©
ÏÂÃæÍÆ¼öµÄһЩ¹¤¾ßºÍ¼¼Êõ¿ÉÒÔÐÖúÄã¡£
»ù×¼»¯£¨BENCHMARKING£©
Óкܶ෽ʽÀ´ÔËÐÐJavaScript´úÂëÆ¬¶ÎµÄ»ù×¼²âÊÔÆäÐÔÄÜ¡ª¡ªÒ»°ãµÄ¼ÙÉèÊÇ£¬»ù×¼¼òµ¥µØ±È½ÏÁ½¸öʱ¼ä´Á¡£ÕâÖÐģʽ±»jsPerfÍŶÓÖ¸³ö£¬²¢ÔÚSunSpiderºÍKrakenµÄ»ù×¼Ì×¼þÖÐʹÓãº
var totalTime, start = new Date, iterations = 1000; while (iterations--) { // Code snippet goes here } // totalTime ¡ú the number of milliseconds taken // to execute the code snippet 1000 times totalTime = new Date - start; |
ÔÚÕâÀҪ²âÊԵĴúÂë±»·ÅÖÃÔÚÒ»¸öÑ»·ÖУ¬²¢ÔËÐÐÒ»¸öÉ趨µÄ´ÎÊý£¨ÀýÈç6´Î£©¡£ÔÚ´ËÖ®ºó£¬¿ªÊ¼ÈÕÆÚ¼õÈ¥½áÊøÈÕÆÚ£¬¾ÍµÃ³öÔÚÑ»·ÖÐÖ´ÐвÙ×÷Ëù»¨·ÑµÄʱ¼ä¡£
È»¶ø£¬ÕâÖÖ»ù×¼²âÊÔ×öµÄÊÂÇé¹ýÓÚ¼òµ¥ÁË£¬ÌرðÊÇÈç¹ûÄãÏëÔËÐÐÔÚ¶à¸öä¯ÀÀÆ÷ºÍ»·¾³µÄ»ù×¼¡£À¬»øÊÕ¼¯Æ÷±¾Éí¶Ô½á¹ûÊÇÓÐÒ»¶¨Ó°ÏìµÄ¡£¼´Ê¹ÄãʹÓÃwindow.performanceÕâÑùµÄ½â¾ö·½°¸£¬Ò²±ØÐ뿼Âǵ½ÕâЩȱÏÝ¡£
²»¹ÜÄãÊÇ·ñÖ»ÔËÐлù×¼²¿·ÖµÄ´úÂ룬±àдһ¸ö²âÊÔÌ×¼þ»ò±àÂë»ù×¼¿â£¬JavaScript»ù×¼Æäʵ±ÈÄãÏëÏóµÄ¸ü¶à¡£ÈçÐè¸üÏêϸµÄÖ¸ÄÏ»ù×¼£¬ÎÒÇ¿ÁÒ½¨ÒéÄãÔĶÁÓÉMathias
BynensºÍJohn-David DaltonÌṩµÄJavascript»ù×¼²âÊÔ¡£
·ÖÎö£¨PROFILING£©
Chrome¿ª·¢Õß¹¤¾ßΪJavaScript·ÖÎöÓкܺõÄÖ§³Ö¡£¿ÉÒÔʹÓô˹¦Äܼì²âÄÄЩº¯ÊýÕ¼ÓÃÁ˴󲿷Öʱ¼ä£¬ÕâÑùÄã¾Í¿ÉÒÔÈ¥ÓÅ»¯ËüÃÇ¡£ÕâºÜÖØÒª£¬¼´Ê¹ÊÇ´úÂëºÜСµÄ¸Ä±ä»á¶ÔÕûÌå±íÏÖ²úÉúÖØÒªµÄÓ°Ïì¡£

Chrome¿ª·¢Õß¹¤¾ßµÄ·ÖÎöÃæ°å
·ÖÎö¹ý³Ì¿ªÊ¼»ñÈ¡´úÂëÐÔÄÜ»ùÏߣ¬È»ºóÒÔʱ¼äÏßµÄÐÎʽÌåÏÖ¡£Õ⽫¸æËßÎÒÃÇ´úÂëÐèÒª¶à³¤Ê±¼äÔËÐС£¡°Profiles¡±Ñ¡Ï¸øÁËÎÒÃÇÒ»¸ö¸üºÃµÄÊÓ½ÇÀ´Á˽âÓ¦ÓóÌÐòÖз¢ÉúÁËʲô¡£JavaScript
CPU·ÖÎöÎļþչʾÁ˶àÉÙCPUʱ¼ä±»ÓÃÓÚÎÒÃǵĴúÂ룬CSSÑ¡ÔñÆ÷·ÖÎöÎļþչʾÁ˶àÉÙʱ¼ä»¨·ÑÔÚ´¦ÀíÑ¡ÔñÆ÷ÉÏ£¬¶Ñ¿ìÕÕÏÔʾ¶àÉÙÄÚ´æÕý±»ÓÃÓÚÎÒÃǵĶÔÏó¡£
ÀûÓÃÕâЩ¹¤¾ß£¬ÎÒÃÇ¿ÉÒÔ·ÖÀë¡¢µ÷ÕûºÍÖØÐ·ÖÎöÀ´ºâÁ¿ÎÒÃǵŦÄÜ»ò²Ù×÷ÐÔÄÜÓÅ»¯ÊÇ·ñÕæµÄÆðµ½ÁËЧ¹û¡£

¡°Profile¡±Ñ¡ÏչʾÁË´úÂëÐÔÄÜÐÅÏ¢¡£
Ò»¸öºÜºÃµÄ·ÖÎö½éÉÜ£¬ÔĶÁZack GrossbartµÄ JavaScript Profiling With
The Chrome Developer Tools¡£
Ìáʾ£ºÔÚÀíÏëÇé¿öÏ£¬ÈôÏëÈ·±£ÄãµÄ·ÖÎö²¢Î´Êܵ½ÒѰ²×°µÄÓ¦ÓóÌÐò»òÀ©Õ¹µÄÈκÎÓ°Ï죬¿ÉÒÔʹÓÃ--user-data-dir
<empty_directory>±êÖ¾À´Æô¶¯Chrome¡£ÔÚ´ó¶àÊýÇé¿öÏ£¬ÕâÖÖ·½·¨ÓÅ»¯²âÊÔÓ¦¸ÃÊÇ×ã¹»µÄ£¬µ«Ò²ÐèÒªÄã¸ü¶àµÄʱ¼ä¡£ÕâÊÇV8±êÖ¾ÄÜÓÐËù°ïÖúµÄ¡£
±ÜÃâÄÚ´æÐ¹Â©¡ª¡ª3¿ìÕÕ¼¼Êõ
ÔڹȸèÄÚ²¿£¬Chrome¿ª·¢Õß¹¤¾ß±»GmailµÈÍŶӴóÁ¿Ê¹Óã¬ÓÃÀ´°ïÖú·¢ÏÖºÍÅųýÄÚ´æÐ¹Â©¡£

Chrome¿ª·¢Õß¹¤¾ßÖеÄÄÚ´æÍ³¼Æ
ÄÚ´æÍ³¼Æ³öÎÒÃÇÍŶÓËù¹ØÐĵÄ˽ÓÐÄÚ´æÊ¹Óá¢JavaScript¶ÑµÄ´óС¡¢DOM½ÚµãÊýÁ¿¡¢´æ´¢ÇåÀí¡¢Ê¼þ¼àÌý¼ÆÊýÆ÷ºÍÀ¬»øÊÕ¼¯Æ÷ÕýÒª»ØÊյĶ«Î÷¡£ÍƼöÔĶÁLoreena
LeeµÄ¡°3¿ìÕÕ¡±¼¼Êõ¡£¸Ã¼¼ÊõµÄÒªµãÊÇ£¬ÔÚÄãµÄÓ¦ÓóÌÐòÖмǼһЩÐÐΪ£¬Ç¿ÖÆÀ¬»ø»ØÊÕ£¬¼ì²éDOM½ÚµãµÄÊýÁ¿ÓÐûÓлָ´µ½Ô¤ÆÚµÄ»ùÏߣ¬È»ºó·ÖÎöÈý¸ö¶ÑµÄ¿ìÕÕÀ´È·¶¨ÊÇ·ñÓÐÄÚ´æÐ¹Â©¡£
µ¥Ò³ÃæÓ¦ÓõÄÄÚ´æ¹ÜÀí
µ¥Ò³ÃæÓ¦ÓóÌÐò£¨ÀýÈçAngularJS£¬Backbone£¬Ember£©µÄÄÚ´æ¹ÜÀíÊǷdz£ÖØÒªµÄ£¬ËüÃǼ¸ºõÓÀÔ¶²»»áË¢ÐÂÒ³Ãæ¡£ÕâÒâζ×ÅÄÚ´æÐ¹Â©¿ÉÄÜÏ൱Ã÷ÏÔ¡£Òƶ¯ÖÕ¶ËÉϵĵ¥Ò³ÃæÓ¦ÓóäÂúÁËÏÝÚ壬ÒòΪÉ豸µÄÄÚ´æÓÐÏÞ£¬²¢ÔÚ³¤ÆÚÔËÐÐEmail¿Í»§¶Ë»òÉç½»ÍøÂçµÈÓ¦ÓóÌÐò¡£ÄÜÁ¦Óú´óÔðÈÎÓúÖØ¡£
Óкܶà°ì·¨½â¾öÕâ¸öÎÊÌâ¡£ÔÚBackboneÖУ¬È·±£Ê¹ÓÃdispose()À´´¦Àí¾ÉÊÓͼºÍÒýÓã¨Ä¿Ç°ÔÚBackbone(Edge)ÖпÉÓã©¡£Õâ¸öº¯ÊýÊÇ×î½ü¼ÓÉϵģ¬ÒƳýÌí¼Óµ½ÊÓͼ¡°event¡±¶ÔÏóÖеĴ¦Àíº¯Êý£¬ÒÔ¼°Í¨¹ý´«¸øviewµÄµÚÈý¸ö²ÎÊý£¨»Øµ÷ÉÏÏÂÎÄ£©µÄmodel»òcollectionµÄʼþ¼àÌýÆ÷¡£dispose()Ò²»á±»ÊÓͼµÄremove()µ÷Ó㬴¦Àíµ±ÔªËØ±»ÒƳýʱµÄÖ÷ÒªÇåÀí¹¤×÷¡£Ember
µÈÆäËûµÄ¿âµ±¼ì²âµ½ÔªËر»ÒƳýʱ£¬»áÇåÀí¼àÌýÆ÷ÒÔ±ÜÃâÄÚ´æÐ¹Â©¡£
Derick BaileyµÄһЩÃ÷ÖǵĽ¨Ò飺
ÓëÆäÁ˽âʼþÓëÒýÓÃÊÇÈçºÎ¹¤×÷µÄ£¬²»Èç×ñѵıê×¼¹æÔòÀ´¹ÜÀíJavaScriptÖеÄÄÚ´æ¡£Èç¹ûÄãÏë¼ÓÔØÊý¾Ýµ½µÄÒ»¸ö´æÂúÓû§¶ÔÏóµÄBackbone¼¯ºÏÖУ¬ÄãÒªÇå¿ÕÕâ¸ö¼¯ºÏʹËü²»ÔÙÕ¼ÓÃÄڴ棬ÄDZØÐëÕâ¸ö¼¯ºÏµÄËùÓÐÒýÓÃÒÔ¼°¼¯ºÏÄÚ¶ÔÏóµÄÒýÓá£Ò»µ©Çå³þÁËËùÓõÄÒýÓã¬×ÊÔ´¾Í»á±»»ØÊÕ¡£Õâ¾ÍÊDZê×¼µÄJavaScriptÀ¬»ø»ØÊÕ¹æÔò¡£
ÔÚÎÄÕÂÖУ¬Derickº¸ÇÁËÐí¶àʹÓÃBackbone.jsʱµÄ³£¼ûÄÚ´æÈ±ÏÝ£¬ÒÔ¼°ÈçºÎ½â¾öÕâЩÎÊÌâ¡£
Felix Geisend?rferµÄÔÚNodeÖе÷ÊÔÄÚ´æÐ¹Â©µÄ½Ì³ÌÒ²ÖµµÃÒ»¶Á£¬ÓÈÆäÊǵ±ËüÐγÉÁ˸ü¹ã·ºSPA¶ÑÕ»µÄÒ»²¿·Ö¡£
¼õÉÙ»ØÁ÷£¨REFLOWS£©
µ±ä¯ÀÀÆ÷ÖØÐÂäÖȾÎĵµÖеÄÔªËØÊ±ÐèÒª ÖØÐ¼ÆËãËüÃǵÄλÖúͼ¸ºÎÐÎ×´£¬ÎÒÃdzÆÖ®Îª»ØÁ÷¡£»ØÁ÷»á×èÈûÓû§ÔÚä¯ÀÀÆ÷ÖеIJÙ×÷£¬Òò´ËÀí½âÌáÉý»ØÁ÷ʱ¼äÊǷdz£ÓаïÖúµÄ¡£

»ØÁ÷ʱ¼äͼ±í
ÄãÓ¦¸ÃÅúÁ¿µØ´¥·¢»ØÁ÷»òÖØ»æ£¬µ«ÊÇÒª½ÚÖÆµØÊ¹ÓÃÕâЩ·½·¨¡£¾¡Á¿²»´¦ÀíDOMÒ²ºÜÖØÒª¡£¿ÉÒÔʹÓÃDocumentFragment£¬Ò»¸öÇáÁ¿¼¶µÄÎĵµ¶ÔÏó¡£Äã¿ÉÒÔ°ÑËü×÷ΪһÖÖ·½·¨À´ÌáÈ¡ÎĵµÊ÷µÄÒ»²¿·Ö£¬»ò´´½¨Ò»¸öеÄÎĵµ¡°Æ¬¶Î¡±¡£ÓëÆä²»¶ÏµØÌí¼ÓDOM½Úµã£¬²»ÈçʹÓÃÎĵµÆ¬¶ÎºóÖ»Ö´ÐÐÒ»´ÎDOM²åÈë²Ù×÷£¬ÒÔ±ÜÃâ¹ý¶àµÄ»ØÁ÷¡£
ÀýÈ磬ÎÒÃÇдһ¸öº¯Êý¸øÒ»¸öÔªËØÌí¼Ó20¸ödiv¡£Èç¹ûÖ»ÊǼòµ¥µØÃ¿´ÎappendÒ»¸ödivµ½ÔªËØÖУ¬Õâ»á´¥·¢20´Î»ØÁ÷¡£
function addDivs(element) { var div; for (var i = 0; i < 20; i ++) { div = document.createElement('div'); div.innerHTML = 'Heya!'; element.appendChild(div); } } |
Òª½â¾öÕâ¸öÎÊÌ⣬¿ÉÒÔʹÓÃDocumentFragmentÀ´´úÌæ£¬ÎÒÃÇ¿ÉÒÔÿ´ÎÌí¼ÓÒ»¸öеÄdivµ½ÀïÃæ¡£Íê³Éºó½«DocumentFragmentÌí¼Óµ½DOMÖÐÖ»»á´¥·¢Ò»´Î»ØÁ÷¡£
function addDivs(element) { var div; // Creates a new empty DocumentFragment. var fragment = document.createDocumentFragment(); for (var i = 0; i < 20; i ++) { div = document.createElement('a'); div.innerHTML = 'Heya!'; fragment.appendChild(div); } element.appendChild(fragment); } |
JSÄÚ´æÐ¹Â©Ì½²âÆ÷
ΪÁ˰ïÖú·¢ÏÖJavaScriptÄÚ´æÐ¹Â©£¬¹È¸èµÄ¿ª·¢ÈËÔ±£¨(Marja H?ltt?ºÍJochen Eisinger£©¿ª·¢ÁËÒ»ÖÖ¹¤¾ß£¬ËüÓëChrome¿ª·¢ÈËÔ±¹¤¾ß½áºÏʹÓ㬼ìË÷¶ÑµÄ¿ìÕÕ²¢¼ì²â³öÊÇʲô¶ÔÏóµ¼ÖÂÁËÄÚ´æÐ¹Â©¡£

Ò»¸öJavaScriptÄÚ´æÐ¹Â©¼ì²â¹¤¾ß
ÓÐÍêÕûµÄÎÄÕ½éÉÜÁËÈçºÎʹÓÃÕâ¸ö¹¤¾ß£¬½¨ÒéÄã×Ô¼ºµ½ÄÚ´æÐ¹Â©Ì½²âÆ÷ÏîÄ¿Ò³Ãæ¿´¿´¡£
Èç¹ûÄãÏëÖªµÀΪʲôÕâÑùµÄ¹¤¾ß»¹Ã»¼¯³Éµ½ÎÒÃǵĿª·¢¹¤¾ß£¬ÆäÔÒòÓжþ¡£Ëü×î³õÊÇÔÚClosure¿âÖаïÖúÎÒÃDz¶×½Ò»Ð©Ìض¨µÄÄڴ泡¾°£¬Ëü¸üÊʺÏ×÷Ϊһ¸öÍⲿ¹¤¾ß¡£
V8ÓÅ»¯µ÷ÊÔºÍÀ¬»ø»ØÊյıê־λ
ChromeÖ§³ÖÖ±½Óͨ¹ý´«µÝһЩ±êÖ¾¸øV8£¬ÒÔ»ñµÃ¸üÏêϸµÄÒýÇæÓÅ»¯Êä³ö½á¹û¡£ÀýÈ磬ÕâÑù¿ÉÒÔ×·×ÙV8µÄÓÅ»¯£º
"/Applications/Google Chrome/Google Chrome" --js-flags="--trace-opt --trace-deopt" |
WindowsÓû§¿ÉÒÔÕâÑùÔËÐÐ chrome.exe ¨Cjs-flags=¡±¨Ctrace-opt ¨Ctrace-deopt¡±
ÔÚ¿ª·¢Ó¦ÓóÌÐòʱ£¬ÏÂÃæµÄV8±êÖ¾¶¼¿ÉÒÔʹÓá£
1.trace-opt ¡ª¡ª ¼Ç¼ÓÅ»¯º¯ÊýµÄÃû³Æ£¬²¢ÏÔÊ¾Ìø¹ýµÄ´úÂ룬ÒòΪÓÅ»¯Æ÷²»ÖªµÀÈçºÎÓÅ»¯¡£
2.trace-deopt ¡ª¡ª ¼Ç¼ÔËÐÐʱ½«Òª¡°È¥ÓÅ»¯¡±µÄ´úÂë¡£
3.trace-gc ¡ª¡ª ¼Ç¼ÿ´ÎµÄÀ¬»ø»ØÊÕ¡£
V8µÄ´¦Àí½Å±¾ÓÃ*£¨ÐǺţ©±êʶÓÅ»¯¹ýµÄº¯Êý£¬ÓÃ~£¨²¨À˺ţ©±íʾδÓÅ»¯µÄº¯Êý¡£
Èç¹ûÄãÓÐÐËȤÁ˽â¸ü¶à¹ØÓÚV8µÄ±êÖ¾ºÍV8µÄÄÚ²¿ÊÇÈçºÎ¹¤×÷µÄ£¬Ç¿ÁÒ½¨Òé ÔĶÁVyacheslav EgorovµÄexcellent
post on V8 internals¡£
HIGH-RESOLUTION TIME ºÍ NAVIGATION TIMING API
¸ß¾«¶Èʱ¼ä£¨HRT£©ÊÇÒ»¸öÌṩ²»ÊÜϵͳʱ¼äºÍÓû§µ÷ÕûÓ°ÏìµÄÑǺÁÃë¼¶¸ß¾«¶Èʱ¼ä½Ó¿Ú£¬¿ÉÒÔ°ÑËüµ±×öÊÇ±È new
Date ºÍ Date.now()¸ü¾«×¼µÄ¶ÈÁ¿·½·¨¡£Õâ¶ÔÎÒÃDZàд»ù×¼²âÊÔ°ïÖúºÜ´ó¡£

¸ß¾«¶Èʱ¼ä£¨HRT£©ÌṩÁ˵±Ç°ÑǺÁÃë¼¶µÄʱ¼ä¾«¶È
ĿǰHRTÔÚChrome£¨Îȶ¨°æ£©ÖÐÊÇÒÔwindow.performance.webkitNow()·½Ê½Ê¹Ó㬵«ÔÚChrome
CanaryÖÐǰ׺±»¶ªÆúÁË£¬ÕâʹµÃËü¿ÉÒÔͨ¹ýwindow.performance.now()·½Ê½µ÷Óá£Paul
IrishÔÚHTML5RocksÉÏÁ˹ØÓÚHRT¸ü¶àÄÚÈݵÄÎÄÕ¡£
ÏÖÔÚÎÒÃÇÖªµÀµ±Ç°µÄ¾«×¼Ê±¼ä£¬ÄÇÓпÉÒÔ׼ȷ²âÁ¿Ò³ÃæÐÔÄܵÄAPIÂ𣿺ðɣ¬ÏÖÔÚÓиöNavigation Timing
API¿ÉÒÔʹÓã¬Õâ¸öAPIÌṩÁËÒ»ÖÖ¼òµ¥µÄ·½Ê½£¬À´»ñÈ¡ÍøÒ³ÔÚ¼ÓÔØ³ÊÏÖ¸øÓû§Ê±£¬¾«È·ºÍÏêϸµÄʱ¼ä²âÁ¿¼Ç¼¡£¿ÉÒÔÔÚconsoleÖÐʹÓÃwindow.performance.timingÀ´»ñȡʱ¼äÐÅÏ¢£º

ÏÔʾÔÚ¿ØÖÆÌ¨ÖеÄʱ¼äÐÅÏ¢
ÎÒÃÇ¿ÉÒÔ´ÓÉÏÃæµÄÊý¾Ý»ñÈ¡ºÜ¶àÓÐÓõÄÐÅÏ¢£¬ÀýÈçÍøÂçÑÓʱΪresponseEnd ¨C fetchStart£¬Ò³Ãæ¼ÓÔØÊ±¼äΪloadEventEnd
¨C responseEnd£¬´¦Àíµ¼º½ºÍÒ³Ãæ¼ÓÔØµÄʱ¼äΪloadEventEnd ¨C navigationStart¡£
ÕýÈçÄãËù¿´µ½µÄ£¬perfomance.memoryµÄÊôÐÔÒ²ÄÜÏÔʾJavaScriptµÄÄÚ´æÊý¾ÝʹÓÃÇé¿ö£¬Èç×ܵĶѴóС¡£
¸ü¶àNavigation Timing APIµÄϸ½Ú£¬ÔĶÁ Sam DuttonµÄ Measuring
Page Load Speed With Navigation Timing¡£
ABOUT:MEMORY ºÍ ABOUT:TRACING
ChromeÖеÄabout:tracingÌṩÁËä¯ÀÀÆ÷µÄÐÔÄÜÊÓͼ£¬¼Ç¼ÁËChromeµÄËùÓÐÏ̡߳¢tabÒ³ºÍ½ø³Ì¡£

About:TracingÌṩÁËä¯ÀÀÆ÷µÄÐÔÄÜÊÓͼ
Õâ¸ö¹¤¾ßµÄÕæÕýÓô¦ÊÇÔÊÐíÄã²¶»ñChromeµÄÔËÐÐÊý¾Ý£¬ÕâÑùÄã¾Í¿ÉÒÔÊʵ±µØµ÷ÕûJavaScriptÖ´ÐУ¬»òÓÅ»¯×ÊÔ´¼ÓÔØ¡£
Lilli ThompsonÓÐһƪд¸øÓÎÏ·¿ª·¢ÕßµÄʹÓÃabout:tracing·ÖÎöWebGLÓÎÏ·µÄÎÄÕ£¬Í¬Ê±Ò²ÊʺÏJavaScriptµÄ¿ª·¢Õß¡£
ÔÚChromeµÄµ¼º½À¸Àï¿ÉÒÔÊäÈëabout:memory£¬Í¬ÑùÊ®·ÖʵÓ㬿ÉÒÔ»ñµÃÿ¸ötabÒ³µÄÄÚ´æÊ¹ÓÃÇé¿ö£¬¶Ô¶¨Î»ÄÚ´æÐ¹Â©ºÜÓаïÖú¡£
×ܽá
ÎÒÃÇ¿´µ½£¬JavaScriptµÄÊÀ½çÖÐÓкܶàÒþ²ØµÄÏÝÚ壬ÇÒ²¢Ã»ÓÐÌáÉýÐÔÄܵÄÒøµ¯¡£Ö»ÓаÑһЩÓÅ»¯·½°¸×ÛºÏʹÓõ½£¨ÏÖʵÊÀ½ç£©²âÊÔ»·¾³£¬²ÅÄÜ»ñµÃ×î´óµÄÐÔÄÜÊÕÒæ¡£¼´±ãÈç´Ë£¬Á˽âÒýÇæÊÇÈçºÎ½âÊͺÍÓÅ»¯´úÂ룬¿ÉÒÔ°ïÖúÄãµ÷ÕûÓ¦ÓóÌÐò¡£
²âÁ¿£¬Àí½â£¬ÐÞ¸´¡£²»¶ÏÖØ¸´Õâ¸ö¹ý³Ì¡£

ͼƬÀ´Ô´: Sally Hunter
½÷¼Ç¹Ø×¢ÓÅ»¯£¬µ«ÎªÁ˱ãÀû¿ÉÒÔÉáÆúһЩºÜСµÄÓÅ»¯¡£ÀýÈ磬ÓÐЩ¿ª·¢ÕßÑ¡Ôñ.forEachºÍObject.keys´úÌæforºÍfor..inÑ»·£¬¾¡¹ÜÕâ»á¸üÂýµ«Ê¹Óøü·½±ã¡£Òª±£Ö¤ÇåÐѵÄÍ·ÄÔ£¬ÖªµÀʲôÓÅ»¯ÊÇÐèÒªµÄ£¬Ê²Ã´ÓÅ»¯ÊDz»ÐèÒªµÄ¡£
ͬʱעÒ⣬ËäÈ»JavaScriptÒýÇæÔ½À´Ô½¿ì£¬µ«ÏÂÒ»¸öÕæÕýµÄÆ¿¾±ÊÇDOM¡£»ØÁ÷ºÍÖØ»æµÄ¼õÉÙÒ²ÊÇÖØÒªµÄ£¬ËùÒÔ±ØÒªÊ±ÔÙÈ¥¶¯DOM¡£»¹ÓоÍÊÇÒª¹Ø×¢ÍøÂ磬HTTPÇëÇóÊÇÕä¹óµÄ£¬ÌرðÊÇÒÆ¶¯ÖÕ¶ËÉÏ£¬Òò´ËҪʹÓÃHTTPµÄ»º´æÈ¥¼õÉÙ×ÊÔ´µÄ¼ÓÔØ¡£
¼ÇסÕ⼸µã¿ÉÒÔ±£Ö¤Äã»ñÈ¡Á˱¾ÎĵĴ󲿷ÖÐÅÏ¢£¬Ï£Íû¶ÔÄãÓÐËù°ïÖú£¡
|