Òªµã£º
ͨ³£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;
} |
|