Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓƵ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Node.js±³ºóµÄV8ÒýÇæÓÅ»¯¼¼Êõ
 
À´Ô´£ºCSDN ·¢²¼ÓÚ 2016-1-25
  3431  次浏览      19
 

Node.jsµÄÖ´ÐÐËÙ¶ÈÔ¶³¬Ruby¡¢PythonµÈ½Å±¾ÓïÑÔ£¬Õâ±³ºó¶¼ÊÇV8ÒýÇæµÄ¹¦ÀÍ¡£±¾ÎĽ«½éÉÜÈçºÎ±àд¸ßÐÔÄÜNode.js´úÂë¡£V8ÊÇChrome±³ºóµÄJavaScriptÒýÇ棬Òò´Ë±¾ÎĵÄÏà¹ØÓÅ»¯¾­ÑéÒ²ÊÊÓÃÓÚ»ùÓÚChromeä¯ÀÀÆ÷µÄJavaScriptÒýÇæ¡£

V8ÓÅ»¯¼¼Êõ¸ÅÊö

V8ÒýÇæÔÚÐéÄâ»úÓëÓïÑÔÐÔÄÜÓÅ»¯ÉÏ×öÁ˺ܶ๤×÷¡£²»¹ý°´ÕÕLars BakµÄ˵·¨£¬ËùÓÐÕâЩÓÅ»¯¼¼Êõ¶¼²»ÊÇËûÃÇ´´ÔìµÄ£¬Ö»ÊÇÔÚÇ°È˵Ļù´¡ÉÏ×öµÄ¸Ä½ø¡£

Òþ²ØÀࣨHidden Class£©

ΪÁ˼õÉÙJavaScriptÖзÃÎÊÊôÐÔËù»¨µÄʱ¼ä£¬V8²ÉÓÃÁ˺Ͷ¯Ì¬²éÕÒÍêÈ«²»Í¬µÄ¼¼ÊõʵÏÖÊôÐԵķÃÎÊ£º¶¯Ì¬µØΪ¶ÔÏó´´½¨Òþ²ØÀà¡£Õâ²¢²»ÊÇʲôÐÂÏë·¨£¬»ùÓÚÔ­Ð͵ıà³ÌÓïÑÔSelf¾ÍÓÃmapÀ´ÊµÏÖÁËÀàËƹ¦ÄÜ¡£ÔÚV8ÖУ¬µ±Ò»¸öеÄÊôÐÔ±»Ìí¼Óµ½¶ÔÏóÖÐʱ£¬¶ÔÏóËù¶ÔÓ¦µÄÒþ²ØÀà»áËæÖ®¸Ä±ä¡£

ÎÒÃÇÓÃÒ»¸ö¼òµ¥µÄJavaScriptº¯ÊýÀ´¼ÓÒÔ˵Ã÷£º

function Point(x, y) {
this.x = x;
this.y = y;
}

µ±new Point(x, y)Ö´ÐÐʱ£¬Ò»¸öеÄPoint¶ÔÏó»á±»´´½¨¡£Èç¹ûÕâÊÇPoint¶ÔÏóµÚÒ»´Î±»´´½¨£¬V8»áΪËü³õʼ»¯Ò»¸öÒþ²ØÀ࣬²»·Á³Æ×÷C0¡£ÒòΪÕâ¸ö¶ÔÏó»¹Ã»Óж¨ÒåÈκÎÊôÐÔ£¬ËùÒÔÕâ¸ö³õʼÀàÊÇÒ»¸ö¿ÕÀà¡£µ½´ËʱΪֹ£¬¶ÔÏóPointµÄÒþ²ØÀàÊÇC0£¨Èçͼ1£©¡£


ͼ1 ¶ÔÏóPointµÄÒþ²ØÀàC0

Ö´Ðк¯ÊýPointÖеĵÚÒ»ÌõÓï¾ä»áΪ¶ÔÏóPoint´´½¨Ò»¸öеÄÊôÐÔx¡£´Ëʱ£¬V8»áÔÚC0µÄ»ù´¡ÉÏ´´½¨ÁíÒ»¸öÒþ²ØÀàC1£¬²¢½«ÊôÐÔxµÄÐÅÏ¢Ìí¼Óµ½C1ÖУºÕâ¸öÊôÐÔµÄÖµ»á±»´æ´¢ÔÚ¾àPoint¶ÔÏóÆ«ÒÆÁ¿Îª0µÄµØ·½£¨Èçͼ2£©¡£


ͼ2 ¶ÔÏóPointµÄÒþ²ØÀà±»¸üÐÂΪC1

ÔÚC0ÖÐÌí¼ÓÊʵ±µÄÀàתÒÆÐÅÏ¢£¬Ê¹µÃµ±ÓÐÁíÍâµÄÒÔÆäΪÒþ²ØÀàµÄ¶ÔÏóÔÚÌí¼ÓÁËÊôÐÔxÖ®ºóÄÜÕÒµ½C1×÷ΪеÄÒþ²ØÀà¡£´Ëʱ¶ÔÏóPointµÄÒþ²ØÀà¸üÐÂΪC1¡£

Ö´Ðк¯ÊýPointÖеĵڶþÌõÓï¾ä»áÌí¼ÓÒ»¸öеÄÊôÐÔyµ½¶ÔÏóPointÖС£Í¬Àí£¬´ËʱV8»áÓÐÒÔϲÙ×÷¡£

  • ÔÚC1µÄ»ù´¡ÉÏ´´½¨ÁíÒ»¸öÒþ²ØÀàC2£¬²¢ÔÚC2ÖÐÌí¼Ó¹ØÓÚÊôÐÔyµÄÐÅÏ¢£ºÕâ¸öÊôÐÔ½«±»´æ´¢ÔÚÄÚ´æÖÐÀëPoint¶ÔÏóµÄÆ«ÒÆÁ¿Îª1µÄµØ·½¡£
  • ÔÚC1ÖÐÌí¼ÓÊʵ±µÄÀàתÒÆÐÅÏ¢£¬Ê¹µÃµ±ÓÐÁíÍâµÄÒÔÆäΪÒþ²ØÀàµÄ¶ÔÏóÔÚÌí¼ÓÁËÊôÐÔyÖ®ºóÄÜÕÒµ½C2×÷ΪеÄÒþ²ØÀà¡£´Ëʱ¶ÔÏóPointµÄÒþ²ØÀà±»¸üÐÂΪC2£¨Èçͼ3£©¡£


ͼ3 ¶ÔÏóPointµÄÒþ²ØÀà±»¸üÐÂΪC2

Õ§Ò»¿´Ëƺõÿ´ÎÌí¼ÓÒ»¸öÊôÐÔ¶¼´´½¨Ò»¸öеÄÒþ²ØÀà·Ç³£µÍЧ¡£Êµ¼ÊÉÏ£¬ÀûÓÃÀàתÒÆÐÅÏ¢£¬Òþ²ØÀà¿ÉÒÔ±»ÖØÓá£Ï´δ´½¨Ò»¸öPoint¶ÔÏóʱ£¬¾Í¿ÉÒÔÖ±½Ó¹²ÏíÓÉ×î³õÄǸöPoint¶ÔÏóËù´´½¨³öÀ´µÄÒþ²ØÀà¡£

ÀýÈ磬ÓÖÓÐÒ»¸öPoint¶ÔÏó±»´´½¨³öÀ´£¬Ò»¿ªÊ¼Point¶ÔÏóûÓÐÈκÎÊôÐÔ£¬ËüµÄÒþ²ØÀཫ»á±»ÉèÖÃΪC0¡£µ±ÊôÐÔx±»Ìí¼Óµ½¶ÔÏóÖÐʱ£¬V8ͨ¹ýC0µ½C1µÄÀàתÒÆÐÅÏ¢½«¶ÔÏóµÄÒþ²ØÀà¸üÐÂΪC1£¬²¢Ö±½Ó½«xµÄÊôÐÔֵдÈëµ½ÓÉC1ËùÖ¸¶¨µÄλÖã¨Æ«ÒÆÁ¿0£©¡£µ±ÊôÐÔy±»Ìí¼Óµ½¶ÔÏóÖÐʱ£¬V8ÓÖͨ¹ýC1µ½C2µÄÀàתÒÆÐÅÏ¢½«¶ÔÏóµÄÒþ²ØÀà¸üÐÂΪC2£¬²¢Ö±½Ó½«yµÄÊôÐÔֵдÈëµ½ÓÉC2ËùÖ¸¶¨µÄλÖã¨Æ«ÒÆÁ¿1£©¡£¾¡¹ÜJavaScript±Èͨ³£µÄÃæÏò¶ÔÏó±à³ÌÓïÑÔ¶¼¸ü¼Ó¶¯Ì¬Ò»Ð©£¬È»¶ø´ó²¿·ÖJavaScript³ÌÐò¶¼»á±íÏÖ³öÏñÉÏÎÄÃèÊöµÄÄÇÑùÔËÐÐʱ¸ß¶È½á¹¹ÖØÓõÄÐÐΪÌØÕ÷À´¡£Ê¹ÓÃÒþ²ØÀàÖ÷ÒªÓÐÁ½¸öºÃ´¦£ºÊôÐÔ·ÃÎʲ»ÔÙÐèÒª¶¯Ì¬×Öµä²éÕÒ£»ÎªV8ʹÓþ­µäµÄ»ùÓÚÀàµÄÓÅ»¯ºÍÄÚÁª»º´æ¼¼Êõ´´ÔìÁËÌõ¼þ¡£

ÄÚÁª»º´æ£¨Incline Cache£©

ÔÚµÚÒ»´ÎÖ´Ðе½·ÃÎÊij¸ö¶ÔÏóµÄÊôÐԵĴúÂëʱ£¬V8»áÕÒ³ö¶ÔÏóµ±Ç°µÄÒþ²ØÀࡣͬʱ£¬¼ÙÉèÔÚÏàͬ´úÂë¶ÎÀïµÄÆäËûËùÓжÔÏóµÄÊôÐÔ·ÃÎʶ¼ÓÉÕâ¸öÒþ²ØÀà½øÐÐÃèÊö£¬²¢ÐÞ¸ÄÏàÓ¦µÄÄÚÁª´úÂëÈÃËûÃÇÖ±½ÓʹÓÃÕâ¸öÒþ²ØÀà¡£µ±V8Ô¤²âÕýȷʱ£¬ÊôÐÔÖµµÄ´æÈ¡½öÐèÒ»ÌõÖ¸Áî¼´¿ÉÍê³É¡£Èç¹ûÔ¤²âʧ°Ü£¬ÔòÔÙ´ÎÐÞ¸ÄÄÚÁª´úÂë²¢ÒƳý¸Õ²Å¼ÓÈëµÄÄÚÁªÓÅ»¯¡£
ÀýÈ磬·ÃÎÊÒ»¸öPoint¶ÔÏóµÄxÊôÐԵĴúÂëÈçÏ£º

point.x

ÔÚV8ÖУ¬¶ÔÓ¦Éú³ÉµÄ»úÆ÷ÂëÈçÏ£º

ebx = the point object
cmp [ebx, <hidden class offset>], <cached hidden class>
jne <inline cache miss>
mov eax, [ebx, <cached x offset>]

Èç¹û¶ÔÏóµÄÒþ²ØÀàºÍ»º´æµÄÒþ²ØÀ಻һÑù£¬Ö´ÐлáÌøתµ½V8ÔËÐÐϵͳÖд¦ÀíÄÚÁª»º´æÔ¤²âʧ°ÜµÄµØ·½£¬ÔÚÄÇÀïÔ­À´µÄÄÚÁª´úÂë»á±»Ð޸ģ¬ÒÔÒƳýÏàÓ¦µÄÄÚÁª»º´æÓÅ»¯¡£Èç¹ûÔ¤²â³É¹¦£¬ÊôÐÔxµÄÖµ»á±»Ö±½Ó¶Á³öÀ´¡£

µ±ÓÐÐí¶à¶ÔÏó¹²Ïíͬһ¸öÒþ²ØÀàʱ£¬ÕâÑùµÄʵÏÖ·½Ê½Ï£¬ÊôÐԵķÃÎÊËٶȿÉÒÔ½Ó½ü´ó¶àÊý¶¯Ì¬ÓïÑÔ¡£Ê¹ÓÃÄÚÁª»º´æ´úÂëºÍÒþ²ØÀàʵÏÖÊôÐÔ·ÃÎʵķ½Ê½Ó붯̬´úÂëÉú³ÉºÍÓÅ»¯µÄ·½Ê½½áºÏÆðÀ´£¬Èô󲿷ÖJavaScript´úÂëµÄÔËÐÐЧÂʵÃÒÔ´ó·ùÌáÉý¡£

Á½´Î±àÒëÓë·´ÓÅ»¯£¨Crankshaft£©

¾¡¹ÜJavaScriptÊǸö·Ç³£¶¯Ì¬µÄÓïÑÔ£¬ÇÒÔ­±¾µÄʵÏÖÊǽâÊÍÐԵģ¬µ«ÏÖ´úµÄJavaScriptÔËÐÐʱÒýÇ涼»á½øÐбàÒë¡£V8£¨ChromeµÄJavaScript£©ÓÐÁ½¸ö²»Í¬µÄÔËÐÐʱ£¨JIT£©±àÒëÆ÷¡£

¡°ÍêÈ«¡±±àÒëÆ÷£¨Unoptimized£©£ºÒ»¿ªÊ¼£¬ËùÓÐV8´úÂ붼ÔËÐÐÔÚUnoptimized״̬¡£ËüµÄºÃ´¦ÊDZàÒëËٶȷdz£¿ì£¬Ê¹´úÂë³õ´ÎÖ´ÐÐËٶȷdz£¿ì¡£

¡°ÓÅ»¯¡±±àÒëÆ÷£¨Optimized£©£ºµ±V8·¢ÏÖij¶Î´úÂëÖ´Ðзdz£ÈÈʱ£¬Ëü»á¸ù¾Ýͨ³£µÄÖ´Ðз¾¶½øÐдúÂëÓÅ»¯£¬Éú³ÉOptimized´úÂë¡£ÓÅ»¯´úÂëµÄÖ´ÐÐËٶȷdz£¿ì¡£

±àÒëÆ÷ÓпÉÄÜ´Ó¡°ÓÅ»¯¡±Í˻ص½¡°ÍêÈ«¡±×´Ì¬£¬ Õâ¾ÍÊÇDeoptimized¡£ÕâÊǺܲ»ÐҵĹý³Ì£¬ÓÅ»¯ºóµÄ´úÂëû·¨ÕýÈ·Ö´ÐУ¬²»µÃ²»Í˻ص½Unoptimized°æ±¾¡£µ±È»×î²»ÐÒµÄÊÇ´úÂ벻ͣµØ±»Optimized£¬È»ºóÓÖ±»Deoptimized£¬Õâ»á´øÀ´ºÜ´óÐÔÄÜËðºÄ¡£Í¼4ÊÇ´úÂëOptimizedÓëDeoptimizedÖ´ÐÐÁ÷³Ì¡£


ͼ4 ´úÂëOptimizedÓëDeoptimizedÖ´ÐÐÁ÷³Ì

¸ßЧÀ¬»øÊÕ¼¯

×î³õµÄV8ÒýÇæÀ¬»øÊÕ¼¯ÊDz»·Ö´úµÄ£¬µ«Ä¿Ç°V8ÒýÇæµÄGC»úÖƼ¸ºõ²ÉÓÃÁËÓëJava HotspotÍêÈ«ÏàͬµÄGC»úÖÆ¡£¶ÔJavaÐéÄâ»úÓо­ÑéµÄ¿ª·¢ÕßÖ±½ÓÌ×Óá£

µ«V8ÓÐÒ»¸öÖØÒªµÄÌØÐÔÈ´ÊÇJavaûÓеģ¬¶øÇÒÊǷdz£ÖØÒªµÄÌØÐÔ£¬Òò´Ë±ØÐëÒªÌáһϣ¬Õâ¸öÌØÐÔ½ÐIncremental Mark+Lazy Sweep¡£ËüµÄÉè¼Æ˼·ÓëJavaµÄCMSÀ¬»øÊÕ¼¯ÀàËÆ£¬¾ÍÊǾ¡Á¿¼õÉÙGCϵͳͣ¶ÙµÄʱ¼ä¡£²»¹ýÔÚV8ÀïÕâÊÇĬÈϵÄGC·½Ê½£¬²»ÏóCMSÐèÒª·Ç³£¸´ÔÓµÄÅäÖ㬶øÇÒ»¹¿ÉÄÜÓÐPromotion FailÒýÆðµÄÎÊÌ⡣ͼ5ÊÇͨ³£Full GCµÄMark SweepÁ÷³Ì¡£


ͼ5 ͨ³£µÄFull GCµÄMark¡¢SweepÁ÷³Ì

Õâ¸öÁ÷³ÌÀïÿ´ÎGC¶¼ÒªÍê³ÉÍêÕûµÄMark¡¢SweepÁ÷³Ì£¬Òò´ËÍ£¶Ùʱ¼ä½Ï¾Ã¡£

ÒýÈëÁËIncrement MarkÖ®ºóµÄÁ÷³ÌÈçͼ6Ëùʾ¡£


ͼ6 ÒýÈëIncrement MarkºóµÄÁ÷³Ì

Õâ¸öÁ÷³Ìÿ´ÎGC¿ÉÒÔÔÚMarkÒ»°ëʱͣס£¬ÔÚÍê³ÉÒµÎñÂß¼­ºó¼ÌÐøÏÂÒ»ÂÖGC£¬Òò´ËÍ£¶Ùʱ¼ä½Ï¶Ì¡£

Ö»Òª±£Ö¤Node.jsÄÚ´æ´óС²»³¬¹ý500MB£¬V8¼´Ê¹·¢ÉúFull GCÒ²ÄÜ¿ØÖÆÔÚ50ºÁÃëÄÚ£¬ÕâʹNode.jsÔÚ¿ª·¢¸ßʵʱӦÓã¨ÈçʵʱÓÎÏ·£©Ê±±ÈJava¸üÓÐÓÅÊÆ¡£

±àд¶ÔV8ÓѺõĸßÐÔÄÜ´úÂë

Òþ²ØÀࣨHidden Class£©µÄ½Ìѵ

ÔÚ¹¹Ô캯ÊýÀï³õʼ»¯ËùÓжÔÏóµÄ³ÉÔ±£¨Òò´ËÕâЩʵÀýÖ®ºó²»»á¸Ä±äÆäÒþ²ØÀࣩ¡£

  • ×ÜÊÇÒÔÏàͬµÄ´ÎÐò³õʼ»¯¶ÔÏó³ÉÔ±¡£
  • ÓÀÔ¶²»Òªdelete¶ÔÏóµÄij¸öÊôÐÔ¡£

ʾÀý1

function Point(x, y) {
this.x = x;
this.y = y;
}

var p1 = new Point(11, 22);
var p2 = new Point(33, 44);
// At this point, p1 and p2 have a shared hidden class
// ÕâÀïµÄp1ºÍp2ÓµÓй²ÏíµÄÒþ²ØÀà
p2.z = 55;
// warning! p1 and p2 now have different hidden classes!
// ×¢Ò⣡Õâʱp1ºÍp2µÄÒþ²ØÀàÒѾ­²»Í¬ÁË£¡

ÔÚÒÔÉÏÀý×ÓÖУ¬p2.zÆÆ»µÁËÉÏÊöÔ­Ôò£¬ ½«µ¼ÖÂp1Óëp2ʹÓÃÁ˲»Í¬µÄÒþ²ØÀà¡£

ÔÚÎÒÃÇΪp2Ìí¼Ó¡°z¡±Õâ¸ö³ÉԱ֮ǰ£¬p1ºÍp2Ò»Ö±¹²ÏíÏàͬµÄÄÚ²¿Òþ²ØÀࡪ¡ªÒò´ËV8¿ÉÒÔÉú³ÉÒ»¶Îµ¥¶À°æ±¾µÄÓÅ»¯»ã±àÂ룬Õâ¶Î´úÂë¿ÉÒÔͬʱ·â×°p1ºÍp2µÄJavaScript´úÂë¡£ÅÉÉú³öÕâ¸öеÄÒþ²ØÀ໹½«Ê¹±àÒëÆ÷ÎÞ·¨ÔÚOptimizedģʽִÐС£ÎÒÃÇÔ½±ÜÃâÒþ²ØÀàµÄÅÉÉú£¬¾Í»á»ñµÃÔ½¸ßµÄÐÔÄÜ¡£

ʾÀý2

function Point(x, y) {
this.x = x;
this.y = y;
}

for (var i=0; i<1000000; i++) {
var p1 = new Point(11, 22);
delete p1.x;
p1.y++;
}

ÓÉÓÚµ÷ÓÃÁËdelete£¬½«µ¼ÖÂhidden class²úÉú±ä»¯£¬´Ó¶øʹp1.y²»ÄÜÓÃinline cacheÖ±½Ó»ñÈ¡¡£
ÒÔÉϳÌÐòÔÚʹÓÃÁËdeleteÖ®ºóºÄʱ0.339s£¬ÔÚ×¢Ê͵ôdeleteºóÖ»Ðè0.05s¡£

DeoptimizedµÄ½Ìѵ

  • µ¥Ì¬²Ù×÷ÓÅÓÚ¶à̬²Ù×÷£»
  • ½÷É÷ʹÓÃtry catchÓëfor in¡£

ʾÀý1

Èç¹ûÒ»¸ö²Ù×÷µÄÊäÈë×ÜÊÇÏàͬÀàÐÍ£¬ÔòÆäΪµ¥Ì¬²Ù×÷¡£·ñÔò£¬²Ù×÷µ÷ÓÃʱµÄij¸ö²ÎÊý¿ÉÒÔ¿çÔ½²»Í¬µÄÀàÐÍ£¬ÄǾÍÊǶà̬²Ù×÷¡£ÀýÈçadd()µÄµÚ¶þ¸öµ÷Óþʹ¥·¢Á˶à̬²Ù×÷£º

function add(x, y) {
return x + y;
}

add(1, 2); // addÖеÄ+²Ù×÷Êǵ¥Ì¬²Ù×÷
add("a", "b"); // addÖеÄ+²Ù×÷±ä³ÉÁ˶à̬²Ù×÷

ÒÔÉÏʾÀýÓÉÓÚ´«ÈëµÄÊý¾ÝÀàÐͲ»Í¬£¬Ê¹add²Ù×÷±àÒë³ÉOptimized´úÂë¡£

ʾÀý2

¸ÃʾÀýÀ´×ÔGoogle I/O 2013µÄÒ»¸öÑݽ²£ºAccele-rating Oz with V8¡£The oz storyµÄÓÎÏ·ÓÐƵ·±µÄGC£¬ÓÎÏ·µÄÖ¡ÂÊÔÚÔËÐÐÒ»¶Îʱ¼äºó²»¶ÏϽµ£¬Í¼7ÊÇGCÇúÏß¡£


ͼ7 ÓÎÏ·GCÇúÏß

ÊÇʲôµ¼ÖÂÈç´ËGCÄØ£¿ ÓÐÈý¸öÒÉ·¸£º

  1. new³öÀ´µÄ¶ÔÏóûÓÐÊÍ·Å£¬Õâͨ³£Óɱհü»ò¼¯ºÏÀàµÄ²Ù×÷µ¼Ö£»
  2. ¶ÔÏóÔÚ³õʼ»¯ºó¸Ä±äÊôÐÔ£¬¾ÍÊÇhidden classʾÀý1µÄÀý×Ó£»
  3. ij¶ÎÌرðÈȵĴúÂëÔËÐÐÔÚDeoptimizedģʽ¡£

unit9µÄ¿ª·¢ÈËÔ±¶ÔJavaScriptµÄ¿ª·¢¹æ·¶ÁËÈ»ÓÚÐØ£¬¾ø¶Ô²»»á·¸Ç°Á½¸ö´íÎó£¬ÓÚÊÇ»³Òɶ¨ÔÚµÚ3¸öÏÓÒÉ·¸¡£Í¼8ÊÇÕï¶ÏtimeºóµÄ½á¹û¡£


ͼ8 Õï¶Ï½á¹û

ͼÖÐdrawSpritesÔËÐÐÔÚOptimized״̬£¬µ«updateSpritesÒ»Ö±ÔËÐÐÔÚDeoptimized״̬¡£

µ¼Ö²»¶ÏGCµÄÔ­Ð×¾¹È»ÊÇÕ⼸ÐдúÂ룺


ͼ9 µ¼Ö²»¶ÏGCµÄ´úÂë

ÒòΪfor inÏÂÃæµÄ´úÂëÔÚV8ÏÂÔÝʱÎÞ·¨ÓÅ»¯¡£°Ñfor inÄÚ²¿µÄ´úÂëÌá³ö³Éµ¥¶ÀµÄfunction£¬V8¾Í¿ÉÒÔÓÅ»¯Õâ¸öfunctionÁË¡£ÕâʱGCºÍµôÖ¡ÂʵÄÎÊÌâ¾ÍÁ¢¿Ì½â¾öÁË¡£GCÇúÏß³öÏÖÁË»ºÂýƽ»ºµÄ״̬£º


ͼ10 ½â¾öÎÊÌâºóµÄÇúÏß

ÒÔÉϽÌѵ²»½ö½öÊÇʹÓÃfor in»òtry catchµÄÎÊÌ⣬ҲÐíδÀ´V8ÒýÇæ»á½â¾öÕâÁ½¸öÎÊÌâ¡£ÎÒÃÇÒªÀí½âÔõô·¢ÏÖÎÊÌâ¡¢½â¾öÎÊÌ⣬»¹ÓÐDeoptimized¾¹È»»á¶ÔGC²úÉúÓ°Ïì¡£

ÒÔÉÏÅŲé¹ý³ÌʹÓÃÁ˨Ctrace-opt¡¢¨Ctrace-deopt¡¢¨CprofÃüÁîÑ¡Ï¼°mac-tick-processorµÈ¹¤¾ß¡£ÖµµÃ×¢ÒâµÄÊÇNode.jsÀïÖ±½ÓʹÓÃmac-tick-processor»òlinux-tick-processorÊǽⲻ³öJavaScript¶ÎÖ´Ðнá¹ûµÄ£¬¿ÉÒÔʹÓÃnode-tick-processorÕâ¸ö¹¤¾ß¡£

ÄÚ´æ¹ÜÀíÓëGCµÄ½Ìѵ

¡¶ÉîÈëdz³öNode.js¡·ÊéÖÐÓÐÏêϸµÄV8ÄÚ´æ¹ÜÀíºÍʹÓþ­Ñé½éÉÜ¡£ÕâÀïֻչʾÁ½¸ö¼òµ¥µÄÀý×Ó¡£

±Õ°ü

±Õ°ü»áʹ³ÌÐòÂß¼­±ä¸´ÔÓ£¬ÓÐʱ»á¿´²»Çå³þÊÇ·ñ¶ÔÏóÄÚ´æ±»ÊÍ·Å£¬Òò´ËҪעÒâÊͷűհüÖеĴó¶ÔÏ󣬷ñÔò»áÒýÆðÄÚ´æй©¡£

ÀýÈçÒÔÏ´úÂ룺

var a = function () { 
var largeStr = new Array(1000000).join(¡®x¡¯);
return function () {
return largeStr;
};
}();

Àý×ÓÖеÄlargeStr»á±»ÊÕ¼¯Â𣿵±È»²»»á£¬ ÒòΪͨ¹ýÈ«¾ÖµÄa()¾Í¿ÉÒÔÈ¡µ½largeStr¡£ ÄÇôÒÔÏ´úÂëÄØ£¿

var a = function () {
var smallStr = 'x';
var largeStr = new Array(1000000).join('x');
return function (n) {
return smallStr;
};
}();

Õâ´Îa()µÃµ½µÄ½á¹ûÊÇsmallStr£¬¶ølargeStrÔò²»ÄÜͨ¹ýÈ«¾Ö±äÁ¿»ñµÃ£¬Òò´ËlargeStr¿É±»ÊÕ¼¯¡£

timer

timerµÄÄÚ´æй©ºÜÆձ飬Ҳ½ÏÄѱ»·¢ÏÖ¡£ÀýÈ磺

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£º

myObj=null;

¶¨Ê±Æ÷ÈÔÈ»»á²»Í£´òÓ¡¡°Time is running out¡±¡£

myObj¶ÔÏ󲻻ᱻÊͷŵô£¬ÒòΪÄÚ²¿µÄmyRef¶ÔÏóÒ²Ö¸ÏòÁËmyObj£¬¶øÄÚ²¿µÄsetTimeoutµ÷ÓûὫ±Õ°ü¼Óµ½Node.jsʼþÑ­»·µÄ¶ÓÁÐÀÒò´ËmyRef¶ÔÏó²»»áÊÍ·Å¡£

ÆäËû½Ìѵ

ʹÓÃÊý×ֵĽÌѵ

µ±ÀàÐÍ¿ÉÒԸıäʱ£¬V8ʹÓñê¼ÇÀ´¸ßЧµØ±êʶÆäÖµ¡£V8ͨ¹ýÆäÖµÀ´ÍƶÏÄã»áÒÔʲôÀàÐ͵ÄÊý×ÖÀ´¶Ô´ýËü¡£ÒòΪÕâЩÀàÐÍ¿ÉÒÔ¶¯Ì¬¸Ä±ä£¬ËùÒÔÒ»µ©V8Íê³ÉÁËÍƶϣ¬¾Í»áͨ¹ý±ê¼Ç¸ßЧÍê³ÉÖµµÄ±êʶ¡£²»¹ýÓÐʱ¸Ä±äÀàÐͱê¼Ç»¹ÊDZȽÏÏûºÄÐÔÄܵģ¬ÎÒÃÇ×îºÃ±£³ÖÊý×ÖµÄÀàÐÍʼÖÕ²»±ä£¬Í¨³£±êʶΪÓзûºÅµÄ31λÕûÊýÊÇ×îÓŵġ£

ʹÓÃArrayµÄ½Ìѵ

ΪÁËÕÆ¿Ø´ó¶øÏ¡ÊèµÄÊý×飬V8ÄÚ²¿ÓÐÁ½ÖÖÊý×é´æ´¢·½Ê½£º

  • ¿ìËÙÔªËØ£º¶ÔÓÚ½ô´ÕÐ͹ؼü×Ö¼¯ºÏ£¬½øÐÐÏßÐÔ´æ´¢£»
  • ×ÖµäÔªËØ£º¶ÔÓÚÆäËûÇé¿ö£¬Ê¹ÓùþÏ£±í¡£

×îºÃ±ðµ¼ÖÂÊý×é´æ´¢·½Ê½ÔÚÁ½ÕßÖ®¼äÇл»¡£

Òò´Ë£º

  • ʹÓôÓ0¿ªÊ¼Á¬ÐøµÄÊý×é¹Ø¼ü×Ö£»
  • ±ðÔ¤·ÖÅä´óÊý×飨ÀýÈç´óÓÚ64K¸öÔªËØ£©µ½Æä×î´ó³ß´ç£¬Áî³ß´ç˳Æä×ÔÈ»·¢Õ¹¾ÍºÃ£»
  • ±ðɾ³ýÊý×éÀïµÄÔªËØ£¬ÓÈÆäÊÇÊý×ÖÊý×飻
  • ±ð¼ÓÔØδ³õʼ»¯»òÒÑɾ³ýµÄÔªËØ¡£

ʾÀý1

a = new Array();
for (var b = 0; b < 10; b++) {
a[0] |= b; // ±­¾ß£¡
}

a = new Array();
a[0] = 0;
for (var b = 0; b < 10; b++) {
a[0] |= b; // ±ÈÉÏÃæ¿ì2±¶
}

ÒÔÉÏÁ½¶Î´úÂ룬ÓÉÓÚµÚÒ»¶Î´úÂëµÄa[0]δ³õʼ»¯£¬ ¾¡¹ÜÖ´Ðнá¹ûÕýÈ·£¬µ«»áµ¼ÖÂÖ´ÐÐЧÂʵĴó·ùϽµ¡£

ʾÀý2

ͬÑùµÄ£¬Ë«¾«¶ÈÊý×é»á¸ü¿ì¡ª¡ªÊý×éµÄÒþ²ØÀà»á¸ù¾ÝÔªËØÀàÐͶø¶¨£¬¶øÖ»°üº¬Ë«¾«¶ÈµÄÊý×é»á±»²ðÏ䣨unbox£©£¬Õâµ¼ÖÂÒþ²ØÀàµÄ±ä»¯¡£¶ÔÊý×é²»¾­ÒâµÄ·â×°¾Í¿ÉÄÜÒòΪװÏä/²ðÏ䣨boxing/unboxing£©¶øµ¼Ö¶îÍâµÄ¿ªÏú¡£ÀýÈçÒÔÏ´úÂ룺

var a = new Array();
a[0] = 77; // ·ÖÅä
a[1] = 88;
a[2] = 0.5; // ·ÖÅ䣬ת»»
a[3] = true; // ·ÖÅ䣬ת»»

ÒòΪµÚÒ»¸öÀý×ÓÊÇÒ»¸ö¸ö·ÖÅ丳ֵµÄ£¬ÔÚ¶Ôa[0] ¡¢a[1]¸³ÖµÊ±Êý×é±»Åж¨ÎªÕûÐÍÊý×飬µ«¶Ôa[2]µÄ¸³Öµµ¼ÖÂÊý×é±»²ðÏäΪÁËË«¾«¶È¡£µ«¶Ôa[3]µÄ¸³ÖµÓÖ½«Êý×éÖØÐÂ×°Ïä»ØÁËÈÎÒâÖµ£¨Êý×Ö»ò¶ÔÏ󣩡£

ÏÂÃæµÄд·¨Ð§Âʸü¸ß£º

var a = [77, 88, 0.5, true];

µÚ¶þÖÖд·¨Ê±£¬±àÒëÆ÷Ò»´ÎÐÔÖªµÀÁËËùÓÐÔªËصÄ×ÖÃæÉϵÄÀàÐÍ£¬Òþ²ØÒþ²ØÀà¿ÉÒÔÖ±½ÓÈ·¶¨¡£
Òò´Ë£º

  • ³õʼ»¯Ð¡¶î¶¨³¤Êý×éʱ£¬ÓÃ×ÖÃæÁ¿½øÐгõʼ»¯£»
  • СÊý×飨СÓÚ64k£©ÔÚʹÓÃ֮ǰÏÈÔ¤·ÖÅäÕýÈ·µÄ³ß´ç£»
  • ÇëÎðÔÚÊý×ÖÊý×éÖдæ·Å·ÇÊý×ÖµÄÖµ£¨¶ÔÏ󣩣»
  • Èç¹ûͨ¹ý·Ç×ÖÃæÁ¿½øÐгõʼ»¯Ð¡Êý×éʱ£¬ÇÐÎð´¥·¢ÀàÐ͵ÄÖØÐÂת»»¡£

½áÂÛ

Google V8ʹJavaScriptÓïÑÔµÄÖ´ÐÐЧÂÊÉÏÁËÒ»´ǫ́½×¡£µ«JavaScriptÊǷdz£Áé»îµÄÓïÑÔ£¬¹ýÓÚÁé»îµÄÓï·¨½«µ¼Ö²»¹æ·¶µÄJavaScriptÓïÑÔÎÞ·¨ÓÅ»¯¡£Òò´Ë£¬ÔÚ±àд¶ÔV8±àÒëÆ÷ÓѺõÄJavaScript»òÕßNode.jsÓïÑÔʱ¾ÍÒª¸ñÍâ×¢Òâ¡£

 

   
3431 ´Îä¯ÀÀ       19
Ïà¹ØÎÄÕ Ïà¹ØÎĵµ Ïà¹Ø¿Î³Ì



Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
Öع¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Öع¹-¸ÄÉƼÈÓдúÂëµÄÉè¼Æ
Èí¼þÖع¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù 8-23[ÌØ»Ý]
LinuxÄں˱à³Ì¼°É豸Çý¶¯ 8-15[±±¾©]
Python¡¢Êý¾Ý·ÖÎöÓë»úÆ÷ѧϰ 8-23[ÌØ»Ý]
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ 8-22[ÏßÉÏ]
QTÓ¦Óÿª·¢ 9-5[±±¾©]

AndroidÊÖ»ú¿ª·¢£¨Ò»£©
Àí½âJavascript
·ÇµäÐÍajaxʵ¼ù
³¹µ×µÄAjax
javascript ʹÓÃCookies
ʹÓà jQuery ¼ò»¯ Ajax ¿ª·¢

Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆģʽºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ

ijº½¿Õ¹«Ë¾IT²¿ JavaScriptʵ¼ù
ijµçÊÓÈí¼þ HTML5ºÍJavaScript
Öк½ÐÅ JavaScript¸ß¼¶Ó¦Óÿª·¢
´óÇìÓÍÌï web½çÃæAjax¿ª·¢¼¼Êõ
ºÍÀûʱ ʹÓÃAJAX½øÐÐWEBÓ¦Óÿª·¢