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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÊÍ·Å.NET Big MemoryºÍÄÚ´æÓ³ÉäÎļþµÄÄÜÁ¿

 
À´Ô´:InfoQ ·¢²¼ÓÚ£º 2017-9-1
  2361  次浏览      32
 

Òªµã£º

ͨ³£Web·þÎñÆ÷¾ßÓеÄÄÚ´æÔ¶Ô¶³¬¹ýÁË.NET GCÔÚÕý³£Çé¿öÏ¿ÉÒÔÓÐЧ´¦ÀíµÄÁ¿¡£

»º´æ·þÎñÆ÷µÄÐÔÄÜÓÅÊÆÍ¨³£»áÒòÔö¼ÓÁËÍøÂç³É±¾¶øÏ½µ¡£

ÄÚ´æÓ³ÉäÎļþͨ³£ÊÇÔÚÏµÍ³ÖØÐÂÆô¶¯ºóÌî³ä»º´æµÄ×î¿ì·½Ê½¡£

·þÎñÆ÷¶Ëµ÷ÓŵÄÄ¿µÄÊdzöÕ¾ÍøÂçÁ¬½Ó´ïµ½±¥ºÍµÄ³Ì¶È¡£ ͨ¹ý×îС»¯CPU¡¢´ÅÅ̺ÍÄÚ²¿ÍøÂçµÄʹÓÃÀ´´ïµ½ÍøÂçÁ¬½Ó±¥ºÍµÄ³Ì¶È¡£

ͨ¹ýÔÚÄÚ´æÖб£´æ¶ÔÏóͼ£¬¿ÉÒÔ»ñµÃͼÐÎÊý¾Ý¿âµÄÐÔÄÜÓÅÊÆ£¬¶øÇÒ²»»áÌá¸ß¸´ÔÓÐÔ¡£

ÑÓÐø¹ØÓÚ.NETƽ̨£¨part1£¬part2£©µÄBig MemoryÖ÷Ì⣬±¾ÎĽéÉÜÁËʹÓÃAgincore¡¯s Big Memory PileÔÚÊܹÜCLR·þÎñÆ÷»·¾³ÖÐʹÓôóÐÍÊý¾Ý¼¯µÄÓÅÊÆ¡£

×ÛÊö

ÏÖ½ñRAMÒѾ­·Ç³£¿ìËÙºÍʵ»Ý£¬µ«ÊÇÉúÃüÖÜÆÚ½Ï¶Ì¡£ ÿ´ÎÖØÐÂÆô¶¯½ø³Ì£¬Äڴ潫±»Çå³ý£¬Ò»Çж¼±ØÐëÖØÐ¼ÓÔØ¡£ÎªÁ˽â¾öÕâ¸öÎÊÌ⣬ÎÒÃÇ×î½üÌí¼ÓÁËÄÚ´æÓ³ÉäÎļþÀ´Ö§³ÖÎÒÃǵĽâ¾ö·½°¸£¬¼´NFX¶Ñ¡£ ʹÓÃÄÚ´æÓ³ÉäÎļþ£¬¿ÉÒÔÔÚÖØÐÂÆô¶¯ºó´Ó´ÅÅÌ¿ìËÙ»ñÈ¡Êý¾Ý¡£

×ܵÄÀ´Ëµ£¬Big Memory·½·¨¶ÔÓÚ¿ª·¢ÈËÔ±ºÍÆóÒµÀ´ËµÊÇÓÐÒæµÄ£¬ÒòΪËü¸Ä±äÁË.NETƽ̨ÉϵĸßÐÔÄܼÆËãģʽ¡£ ´«Í³µÄBig MemoryϵͳÊÇÒÔC/C ++·ç¸ñµÄÓïÑÔ¹¹½¨µÄ£¬Ö÷Òª´¦Àí×Ö·û´®ºÍ×Ö½ÚÊý×é¡£ µ«Êǵ±×¨×¢ÓڵײãÊý¾Ý½á¹¹Ê±£¬¾ÍºÜÄѽâ¾öʵ¼ÊµÄÒµÎñÎÊÌâÁË£¬ËùÒÔÎÒÃÇҪרעÓÚCLR¶ÔÏó¡£ ÄÚ´æ¶ÑÔÊÐí¿ª·¢ÈËÔ±¸ù¾Ý¶ÔÏóʵÀý½øÐÐ˼¿¼£¬²¢Óë¾ßÓÐÊôÐÔ¡¢±àÂë¡¢¼Ì³ÐºÍÆäËûCLRÔ­Éú¹¦ÄܵÄÊýÒÚ¸öʵÀýÅäºÏ¹¤×÷¡£

ÓëÓïÑÔÎ޹صĶÔÏóÄ£ÐͲ»Í¬£¬¾ÍÏñһЩÈí¼þ¹©Ó¦ÉÌ£¨ÈçÖ§³ÖJavaºÍ.NETµÄ¹©Ó¦ÉÌ£©ËùÌá³öµÄÄÇЩ£¬ËüÃÇÒýÈë¶îÍâµÄ±ä»»ÒÔ¼°ÐèÒª¶îÍâÁ÷Á¿/ÉÏÏÂÎÄÇл»/ÐòÁл¯µÄËùÓнø³ÌÍâ½â¾ö·½°¸¡£Ïà·´£¬ÎÒÃǽ«ÌÖÂÛ½ø³ÌÄڵı¾µØ¶Ñ»òÀà¡°¶Ñ¡±¶ÔÏ󣬻òÕßÊÇÔÚÍйܴúÂëÖеĴóÐÍ×Ö½ÚÊý×éÖеĶÔÏó¡£ÕâЩ¶ÔÏó¶ÔÓÚGCÀ´ËµÊDz»¿É¼ûµÄ¡£

ÓÃÀý

ΪʲôÓÐÈË»áʹÓü¸Ê®»ò¼¸°ÙGBµÄRAMÄØ£¿ÒÔÏÂÊÇBig Memory Pile¼¼ÊõµÄһЩÒÑÑéÖ¤¹ýµÄÓÃÀý¡£

Ê×ÏÈÊÇ»º´æ¡£ÔÚµç×ÓÉÌÎñºó¶Ë£¬´æ´¢×ÅÊýÊ®ÍòÖÖÓÃÀ´ÏÔʾΪÏêϸĿ¼ÁбíµÄ²úÆ·¡£Ã¿ÖÖ²úÆ·¿ÉÄÜÓÐÊýÊ®ÖÖ±äÌå¡£µ±ÔÚµ¥¸öÆÁÄ»ÉϹ¹½¨Ò»¸öչʾ30¶à¸ö²úÆ·µÄĿ¼ÊÓͼʱ£¬¼´Ê¹Êǵ¥¸öÓû§Ê¹Óý¥½øÊ½¼ÓÔØ¹ö¶¯Ò³Ã棬ҲÐèÒªºÜ¿ìËٵػñÈ¡µ½ÕâЩ¶ÔÏó¡£ÎªÊ²Ã´²»Ê¹ÓÃRedis»òMemcached£¿ÒòΪÔÚͬһ¸ö½ø³ÌÖÐ×öÏàͬµÄÊÂÇ飬¿ÉÒÔ½ÚÊ¡ÍøÂçÁ÷Á¿ºÍÐòÁл¯¿ªÏú¡£½«ÍøÂçÊý¾Ý°üת»»³É¶ÔÏó¿ÉÄÜÊǷdz£°º¹óµÄ²Ù×÷¹ý³Ì¡£Èç¹ûÒª³ÖÓÐÊýÊ®ÍòÖÖ²úÆ·¼°Æä±äÌ壬ÄúÊÇ·ñ»áʹÓÃ×Öµä<id£¬Product>£¨»òIMemoryCache£©£¿µ¥µ¥»º´æÊý¾Ý±ãÌṩÁË×ã¹»µÄ¶¯»úÀ´Ê¹ÓÃRAM£¬µ«Æäʵ»¹Óиü¶àµÄ·½Ãæ...

ÁíÒ»¸ö»º´æÓÃÀýÊÇREST API·þÎñÆ÷£¬¿ÉÒÔ½«Ô¼5000Íò¸öºÜÉÙ¸ü¸ÄµÄJSONÏòÁ¿ÐòÁл¯ÎªUTF8±àÂëµÄ×Ö½ÚÊý×é¡£´óÔ¼1024×Ö½ÚµÄÊý×é¿ÉÒÔÖ±½Ó·¢Ë͵½HttpÁ÷ÖУ¬Ê¹µÃÍøÂçÆ¿¾±´¦ÔÚ80,000 req / sec×óÓÒ¡£

ʹÓø´ÔÓ¶ÔÏóͼÊÇPileµÄÁíÒ»¸öÍêÃÀ°¸Àý¡£ÔÚÉç½»Ó¦ÓÃÖУ¬ÐèÒª±éÀúTwitterÉϵĶԻ°Ï̡߳£µ±×·×ÙË­ÔÚÉçÇøÃ½ÌåÍøÕ¾ÉÏʲôʱºò˵ÁËʲôʱ£¬ÔÚÄÚ´æÖгÖÓÐÊýÒÚ¸öСÏòÁ¿µÄ¼ÛÖµÊÇÎÞ·¨¹ÀÁ¿µÄ¡£Ò²¿ÉÒÔÑ¡ÔñʹÓÃgraph DB£¬¶øÔÚÕâ¸ö°¸ÀýÖУ¬ÔÚͬһ¸ö½ø³ÌÖУ¨ËüÊÇÓÉWeb MVCÓ¦ÓóÌÐòÍйܵÄ×é¼þ£©£¬ÕýÊÇʹÓÃÁËgraph DB¡£ÎÒÃÇÏÖÔÚÕýÔÚ´¦ÀíÿÃë100KÒÔÉϵÄREST APIµ÷Óã¬ÕâÊÜÏÞÓÚÎÒÃǵÄÍøÂçÁ¬½ÓÊý£¬²¢ÇÒÎÒÃǽ«CPUʹÓÃÂʱ£³ÖÔڽϵ͵Äˮƽ¡£

ÔÚÕâ¸öºÍÆäËûÓÃÀýÖУ¬ºǫ́¹¤×÷ÈËÔ±Ëæ×ű仯¶øÒì²½µØ¸üÐÂÉ罻ͼ±í¡£ÔÚÐí¶àÇé¿öÏ£¬ÈçÇ°ÃæÌáµ½µÄ²úƷĿ¼£¬Ëü¿É±»ÓÅÏÈÍê³É¡£µ«ÊÇÄã²»Ó¦¸ÃʹÓÃÖ»³ÖÓÐÊý¾Ý×Ó¼¯µÄÆÕͨ»º´æÀ´Íê³É¸üС£

¹¤×÷Ô­Àí

Big Memory Pileͨ¹ýÔÚ´óÐÍ×Ö·ûÊý×éÖÐʹÓÃCLR¶ÔÏóͼµÄ͸Ã÷ÐòÁл¯À´½â¾öGCÎÊÌ⣬ÓÐЧµØ¡°Òþ²Ø¡±ÁËGC¿É»ñÈ¡·¶Î§ÄڵĶÔÏó¡£È»¶ø²¢²»ÊÇËùÓеĶÔÏóÀàÐͶ¼ÐèÒªÍêÈ«ÐòÁл¯£¬ ×Ö·û´®ºÍ×Ö½ÚÊý×é¶ÔÏó»á±»Ð´Èë¶ÑÖУ¬ÒòΪ»º³åÇø»áÈÆ¹ýËùÓеÄÐòÁл¯»úÖÆ£¬ÔÚ6ºËÖ÷»úÉÏÿÃë¿ÉÍê³É³¬¹ý6°ÙÍò´Î64×ÖµÄ×Ö·û´®²åÈë¡£

ÕâÖÖ·½·¨µÄÖ÷ÒªÓŵãÊÇÆäʵÓÃÐÔ¡£ÏÖʵÉú»îÖеݸÀý£¬ÔÚʹÓÃÔ­ÉúCLR¶ÔÏóÄ£ÐÍʱÒÑÏÔʾ³ö¾ªÈ˵ÄÕûÌåÐÔÄÜ£¬ÒòΪ²»ÐèÒª´´½¨×¨ÓÃDTO£¬ÕâÑù¿ÉÒÔ½ÚÊ¡¿ª·¢Ê±¼ä£¬¶øÇÒÒòΪ²»ÐèÒª´´½¨Öмä¹ý³ÌËùÐèµÄ¶îÍ⸱±¾£¬ÔËÐÐËÙ¶ÈÒ²»á¸ü¿ì¡£

×ܵÄÀ´Ëµ£¬Pile½«´ó²¿·ÖI/O°ó¶¨´úÂëת»»³ÉCPUÏÞÖÆ´úÂ롣ͨ³£Çé¿öÏ£¬Òì²½£¨¾ßÓÐI/O°ó¶¨£©ÊµÏֵĵäÐͰ¸ÀýÊÇ100£¥µÄͬ²½ÏßÐÔ´úÂ룬ÕâÖÖ´úÂë¸ü¼Ó¼òµ¥£¬²¢ÇÒÔÚµ¥¸ö·þÎñÆ÷ÉÏÖ´Ðжà¸ö100K²Ù×÷/ÃëʱÐÔÄܸüºÃ£¬ÒòΪTaskºÍÆäËûÒì²½/µÈ´ýµÄʵÏÖÓÐÒþ²Ø¿ªÏú£¨²Î¼ûÕâÀïºÍÕâÀ¡£

Big Memory Ó³ÉäÎļþ

ÄÚ´æÖеĴ¦Àí¹ý³ÌÊÇ¿ìËÙºÍÈÝÒ×ʵÏֵ쬵«Êǵ±½ø³ÌÖØÐÂÆô¶¯Ê±£¬Êý¾Ý¼¯»á¶ªÊ§£¬Õâ¸öÊý¾Ý¼¯Í¨³££¨¼¸Ê®µ½¼¸°ÙGB£©ÊǺܴóµÄ¡£´ÓԭʼÊý¾ÝÔ´À­³öËùÓÐÊý¾Ý¿ÉÄÜÊǷdz£ºÄʱµÄ£¬ÄÇÊÇÔÚÖØÐÂÆô¶¯ºóÎÞ·¨³ÐÊܵÄʱ¼ä¿ªÏú¡£

ΪÁ˽â¾öÕâ¸öÎÊÌ⣬ÎÒÃÇÌí¼ÓÁËÄÚ´æÓ³ÉäÎļþ£¨MMF£©À´Ö§³ÖʹÓñê×¼µÄ.NETÀࣺMemoryMappedFileºÍMemoryMappedViewAccessor¡£ÏÖÔÚ£¬ÎÒÃÇʹÓÃMemoryMappedViewAccessorʵÀýºÍһЩµÍ¼¶¼¼ÇÉÀ´Ö±½ÓʹÓÃÖ¸Õë·ÃÎÊÊý¾Ý£¬¶ø²»ÊÇʹÓÃ×Ö½ÚÊý×é×÷ΪÄÚ´æ¶ÎµÄºó±¸´æ´¢£¬ËùÓÐÕâЩ²Ù×÷¶¼Ê¹Óñê×¼µÄC££À´Íê³É£¬²»ÐèÒªC ++²ÎÓ룬ÒÔ±£³ÖÒ»Çмòµ¥£¬ÌرðÊǹ¹½¨Á´¡£

ͨ¹ýMemoryMappedViewAccessor£¨MMFMemoryÀࣩдÈëÄÚ´æÖ±½ÓÐÞ¸ÄOS²ãÖеÄÐéÄâÄÚ´æÒ³Ãæ¡£Èç¹û²Ù×÷ϵͳ²»Äܽ«ÕâÐ©Ò³Ãæ½»»»µ½´ÅÅÌÖУ¬±ã»á³¢ÊÔ½«ÕâÐ©Ò³Ãæ·ÅÔÚÎïÀíRAMÖС£½«PileдÈëMMFµÄÒ»¸öºÜºÃµÄ¹¦ÄÜÊÇ£¬½ø³ÌÔڹرպóÂíÉÏÖØÆôÔò²»ÐèÒª´Ó´ÅÅÌÖØÐ¶ÁÈ¡ËùÓÐÄÚÈÝ¡£¼´Ê¹ÔÚ½ø³ÌÖÕÖ¹Ö®ºó£¬²Ù×÷ϵͳÈÔ½«Ó³Éäµ½½ø³ÌµØÖ·¿Õ¼äµÄÒ³Ãæ±£Áô¡£Æô¶¯Ê±£¬MMFPile¿ÉÒÔÒԱȴӴÅÅÌÖØÐ¶ÁÈ¡¸ü¿ìµÄ·½Ê½·ÃÎÊRAMÖеÄÒ³Ãæ¡£

Çë×¢Ò⣬ÓÉÓÚÔÚMMFMemoryÀàÖÐÍê³ÉÁË·ÇÍйܴúÂëµÄÉÏÏÂÎÄÇл»£¬MMFPileµÄÐÔÄÜ»á±ÈDefaultPileÂý£¨»ùÓÚ×Ö½ÚÊý×飩¡£

ÒÔÏÂÊÇһЩ²âÊÔ½á¹û£º

»ù×¼²âÊÔ²åÈë200,000,000×Ö·û´®[32] 12¸öỊ̈߳º

£¨»úÆ÷£ºIntel Core I7 3.2 Ghz£¬6 Core£¬Win 7 64bit£¬VS2017£¬.NET 4.5£©

DefaultPile

24Ãë@ 8.3°ÙÍò´Î²åÈë/Ãë= 8.5 GbÄÚ´æ;È«GC <8 ms

MMFPile

1.41Ãë@ 4.9°ÙÍò´Î²åÈë/Ãë= 8.5 GBÄÚ´æ+´ÅÅÌ;È«GC <10 ms

2.ÔÚStop£¨£©ÉÏÇå³ýËùÓÐÊý¾Ýµ½´ÅÅÌ£º10Ãë

3.¶ÁÈ¡ËùÓÐÊý¾Ýµ½ram£º48Ãë=?177 mbyte /Ãë

ÕýÈçÄãËù¿´µ½µÄ£¬MMF½â¾ö·½°¸È·ÊµÓжîÍâµÄ¿ªÏú¡£ÓÉÓÚ·ÇÍйܵÄMMFת»»£¬ÍÌÍÂÁ¿½ÏµÍ£¬²¢ÇÒÒ»µ©´Ó´ÅÅ̰²×°Pile£¬ÔòºÄʱÓëʹÓôÅÅÌÊý¾ÝÔ¤ÏÈ·ÖÅ䏸RAMµÄÄÚ´æÁ¿³É±ÈÀý¡£È»¶ø£¬Äã²»ÐèÒªµÈ´ý¼ÓÔØÕû¸ö¹¤×÷¼¯£¬ÒòΪMMFPileÔÚPile.Start()Ö®ºóÁ¢¼´¿ÉÓÃÓÚдÈëºÍ¶ÁÈ¡£¬Êý¾ÝµÄÈ«²¿¸ºÔؽ«ÐèҪʱ¼ä¿ªÏú£¬ÔÚÉÏÃæµÄʾÀýÖÐ8.5 GBÊý¾Ý¼¯ÐèÒª48ÃëµÄʱ¼ä²ÅÄÜÔÚÖеµSSDµÄRAMÖÐÔ¤ÈÈ¡£

»ù×¼²âÊÔ²åÈë200,000,000 ¸öPerson¶ÔÏ󣨾ßÓÐ7¸ö×ֶΣ© 12¸öỊ̈߳º

DefaultPile

85Ãë@ 2.4°ÙÍò´Î²åÈë/Ãë= 14.5 GbÄÚ´æ;È«GC <10ms

MMFPile

101Ãë@ 1.9°ÙÍò´Î²åÈë/Ãë= 14.5 GBÄÚ´æ+´ÅÅÌ;È«GC <10ms

ÔÚStop()ÉÏÇå³ýËùÓÐÊý¾Ýµ½´ÅÅÌ£º30Ãë

¶ÁÈ¡ËùÓÐÊý¾Ýµ½ram£º50Ãë=?290Íò×Ö½Ú/Ãë

ÆäËû¸Ä½ø

´ÓÉÏÒ»´ÎÔÚInfoQÉÏ·¢±íÎÄÕÂÒÔÀ´£¬ÎÒÃǶÔNFX.Pile×öÁ˺ܶà¸Ä½ø£º

ԭʼ·ÖÅäÆ÷/·Ö²ãÉè¼Æ

PileµÄʵÏÖ¿ÉÒÔ¸üºÃµØ·Ö²ã£¬´Ó¶ø¿ÉÒÔ½«×Ö·û´®ºÍ×Ö½ÚÊý×éÖ±½Ó´ÓRAMµÄ½Ï´óµÄÁ¬Ðø¿éÖÐÖ±½ÓдÈë/¶ÁÈ¡¡£Õû¸öÐòÁл¯»úÖÆÍêÈ«ÈÆ¹ý×Ö½ÚÊý×飬´Ó¶ø¿ÉÒÔʹÓÃPile×÷Ϊһ¸öԭʼµÄ×Ö½ÚÊý×é·ÖÅäÆ÷¡£

var ptr = pile.Put£¨¡°abcdef¡±£©; //Õâ½«ÈÆ¹ýËùÓÐÐòÁл¯³ÌÐò
//²¢Ê¹ÓÃUTF8Encoding´úÌæ
var original = pile.Get£¨ptr£©as string;

ÐÔÄÜÌáÉý

ÓÉÓÚÒýÈëÁËÊÔͼ±ÜÃâ¶àÏ߳̾ºÕùµÄ»¬¶¯´°¿ÚÓÅ»¯ÊµÏÖ£¬¶Î·ÖÅäÂß¼­ÒѾ­±»Ð޸쬲¢ÇÒÔÚ¶àÏ̲߳åÈëÆÚ¼äÌá¸ßÁË50£¥ÒÔÉϵÄÐÔÄÜ¡£´ËÍ⣬ÔÚ´ó¶àÊýÇé¿öÏÂ×Ö·û´®ºÍ×Ö½ÚÊý×éÍêÈ«ÈÆ¹ý´®ÐÐÆ÷»áÌá¸ßËٶȽü5°ÙÍò´Î²åÈë/Ã루200£¥ÒÔÉϵĸĽø£©¡£

ö¾Ù

ÀûÓÃIEnumerable <PileEntry>½Ó¿ÚʵÏÖ£¬¿ÉÒÔ»ñµÃÕû¸ö¶ÑµÄÄÚÈÝ¡£ PileEntry½á¹¹ÌåÈçÏ£º

foreach(var entry in pile){
Console.WriteLine(¡°{0} points to
{1} bytes¡±.Args( entry.Pointer,
entry.Size));
var data = pile.Get(entry.Pointer);
¡­
}

»º´æ³Ö¾Ã»¯

³öÓÚÐÔÄÜÔ­Òò£¬»º´æµÄĬÈÏģʽÊÇ¡°ÍƲâµÄ¡±¡£ÔÚÕâÖÖģʽÏ£¬¼´Ê¹´æÔÚ×ã¹»µÄÄڴ棬ɢÁÐÂë³åͻҲ¿ÉÄܵ¼Ö½ϵ͵ÄÓÅÏȼ¶Ïî´Ó¸ßËÙ»º´æÖе¯³ö¡£

»º´æ·þÎñÆ÷¿ÉÒÔÒÔ¡°³Ö¾Ã¡±Ä£Ê½´æ´¢Êý¾Ý£¬¹¤×÷·½Ê½¸üÏñÆÕͨµÄ×ֵ䡣ÒòΪ³Ö¾Ã»¯Ä£Ê½ÐèÒªÔÚbucketÖнøÐÐÖØÐÂÅÅÁУ¬ËùÒÔÏà±ÈÍÆ²âģʽ»áÂý5-10£¥¡£¶ÔÓÚ´ó¶àÊýÓ¦ÓóÌÐòÀ´ËµÊÇÄÑÒÔ²ì¾õµÄ¡£µ«ÊÇÐèÒª¸ù¾ÝÌØ¶¨µÄÇé¿ö½øÐвâÊÔ´Ó¶øÈ·¶¨×î¼ÑʵÏÖ·½Ê½¡£

//ΪËùÓбíÖ¸¶¨TableOptions£¬½«±í³Ö¾Ã»¯
cache.DefaultTableOptions = new TableOptions£¨¡°*¡±£©
{
CollisionMode = CollisionMode.Durable
};

Ô­µØ¶ÔÏóÍ»±äºÍÔ¤·ÖÅä

¿ÉÒÔÔÚÏÖÓÐPilePointerµØÖ·¸Ä±ä¶ÔÏó¡£ÐµÄAPI Put£¨PilePointer ...£©ÔÊÐíÔÚÏÖÓÐλÖ÷ÅÖò»Í¬µÄÓÐÐ§ÔØºÉ¡£Èç¹ûеÄÓÐÐ§ÔØºÉ²»ÊʺÏÏÖÓеĿ飬ÄÇôPile½«´´½¨Ò»¸öÄÚ²¿Á´½Óµ½ÐÂλÖã¨* nixϵͳÖеÄÒ»¸öÎļþϵͳÁ´½Ó£©£¬ÓÐЧµØÊ¹Ô­Ê¼Ö¸ÕëÖ¸ÏòеÄλÖá£É¾³ýԭʼָÕ뽫ɾ³ýÁ´½Ó¼°ÆäËùÖ¸ÏòµÄÄÚÈÝ¡£±ðÃûÊÇÍêȫ͸Ã÷µÄ£¬²¢ÔÚ¶Áȡʱ²úÉúÄ¿±êÓÐÐ§ÔØºÉ¡£

»¹¿ÉÒÔͨ¹ýÔÚµ÷ÓÃPut£¨£©Ê±Ö¸¶¨preallocateBlockSize£¬ÎªÓÐЧ¸ºÔØÔ¤·ÖÅä¸ü¶àµÄRAM¡£

//¶ÑÖд洢Á´±íµÄʵÏÖ
public class ListNode{
public PilePointer Previous;
public PilePointer Next;
public PilePointer Value;}
...
private IPile m_Pile;//big memory pile
private PilePointer m_First;//list head
private PilePointer m_Last;//list tail
...
//½«PersonʵÀý×·¼Óµ½¶ÑÖд洢µÄÈËÔ±Á´½ÓÁбí
//·µ»Ø×îºóÒ»¸ö½Úµã
public PilePointer Append(Person person){
var newLast = new ListNode{ Previous = m_Last,
Next = PilePointer.Invalid,
Value = m_Pile.Put(person)};

var existingLast = m_Pile.Get(m_Last);
existingLast.Next = node;
m_Pile.Put£¨m_Last£¬existingLast£©; //ÔÚÏÖÓеÄptr m_LastÖнøÐб༭
m_Last = m_Pile.Put£¨newLast£©; //Ïòβ²¿Ìí¼Óнڵã

return m_Last;
}

   
2361 ´Îä¯ÀÀ       32
 
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
 
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
 
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì