工作杂谈1

工作杂谈

今天想写的不是什么特定的内容,就说一下今天新学到的两个知识点。

一,C#中字典容量计算

我们都知道初始化一个字典的时候可以给它设置一个初始容量,这样就会避免resize带来的性能损耗问题,但是这个容量具体是怎么分配的呢?真的是分配多少就开辟多少吗?
今天我在使用memory profiler查看内存使用的时候,发现一个我设置初始容量为16500的Dictonary,实际容量为17519,后来经过调查发现在C#中hash bucket容量分配都是质数,resize的时候也是取大于当前容量二倍的最小质数为新的容量(为什么初始化的时候容量为17519而不是16519还有待我搞明白……),为什么取质数和C#解决哈希冲突的策略有关,C#中使用拉链法来处理冲突,这种方法有一个弊端,就是如果在散列桶中分配不均,导致某一个索引上的链表对应了太多的值,会大大降低查找的效率,所以保证分配的平均是一个很关键的问题。如果bucket容量不是质数,当遇到一个hash值和bucket容量有公约数时,其实它最终分配的位置就有一定规律性了。
举个例子,假如bucket容量为4,hash值为2n,2n对4取模实际上相当于2倍的n对2取模,也就是这个值只会存在索引为0或者2的位置上,一定不会出现在1或者3上。

二,Unity中使用AssetDataBase.MoveAsset来避免reimporting

这一部分没什么好讲的,内容就如标题所示。我们框架在打包的时候,如果使用AssetBundle资源加载方式的话,就不能把资源目录下的东西打进包内,但是资源通常都会放在某个Resources文件夹下,方便Editor下使用Resources.Load读取,所以需要打包的时候给文件夹改名。实际上mono没有提供rename函数,改名都是用move,为了避免move的时候产生reimporting浪费时间,推荐使用AssetDataBase.MoveAsset函数。


版权声明:本文为a672934675原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。