ngui的betterlist做了哪些性能改进?

betterlist简介:

  betterlist是对System.Collections.Generic.List的改进。
  betterlist版本对应该连接:https://github.com/NewbieGameCoder/BetterList
  作者的目标:对list增删操作的加速,减少gc耗时。

betterlist性能改进点:

  1.相比list,betterlist在clear没有对持有的数组进行内存释放(Array.Clear中会对数组内存做释放并重置),而是只是对标记长度的字段置零。
    好处:
      减少了Clear的GC操作。
    坏处:
      占用着内存。
      元素仍被引用着。

  2.相比list,betterList推荐直接访问size整型成员来获取元素总个数,list则是通过Count属性(getter)来访问。由于C#会被编译成il,il没有属性的概念,il中会生成代表属性的get/set方法,所以直接访问整型成员降低了性能。
    好处:
      加速了访问。
    坏处:
      缺少属性应有的包含,可能会被外部修改size字段。

  3.相比list,当betterlsit需要拓容时,会从之前下调容量时缓存的节点缓存池(BetterPoolNodeList的节点用链表引用各个数组,取时根据能保证添加新元素的最小长度通过二分法找池中合适大小的链表)中获取增量,池中节点不足才会new,同时,它会检查期满节点做真正的释放。当betterlist做Trim时可下调数组容量,将不用的节点放入缓存池中。
此外,池是静态字段,同类型betterlist可以分享使用该池。
    好处:
      拓容时循环利用之前不用的节点。
      消容时缓存不用节点,减少gc。
      BetterList的最小容量是32,List的最小容量是4。
    坏处:
      占用着内存。
      元素仍被引用着。

betterlist的其他缺点:

  1.跟list一样线程不安全,并发操作需要自行加锁。
  2.相比list,list.sort就是array.sort,有相对复杂的规则,而betterlist的sort是自实现的排序相对低效。

betterlist推荐使用场景:

  1.经常对list做增删操作。
  2.基本不对list做sort操作。
  3.对元素个数需求大于32。
  4.不推荐做缓冲池容器,建议缓存池独立一套更灵活,两者存在重复逻辑。

参考:

Array.Clear是如何实现释放:
https://stackoverflow.com/questions/5557609/what-does-array-clear-actually-do-under-the-covers
微软list的源码:
https://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs
C#属性和字段的性能:
https://wenku.baidu.com/view/d81b25c5773231126edb6f1aff00bed5b8f373f3.html?wkts=1672364942910&bdQuery=C%23+属性和字段的性能
二分法返回值用法:
https://learn.microsoft.com/zh-cn/dotnet/api/system.array.binarysearch?redirectedfrom=MSDN&view=net-7.0
list的sort的实现
https://www.cnblogs.com/workharder/p/14384077.html
https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1.sort?redirectedfrom=MSDN&view=net-5.0#System_Collections_Generic_List_1_Sort_System_Comparison__0__

posted @ 2022-12-30 11:54  昂流  阅读(219)  评论(0编辑  收藏  举报
//替换成自己路径的js文件 hhttp(s)://static.tctip.com/tctip-1.0.4.min.js