有关CPU占用和缓存的一些见解
2009-05-09 11:08:06 来源:WEB开发网首先说说缓存的问题,比如我们有1000000个字符串构成的List<string>需要缓存在内存中,大约占用了100M的内存空间。如果需要对这些数据进行检索的话,很明显直接由于数据量太大,即使在内存中检索效率也不会太高。
一般可以想到的办法就是利用层次话的字典结构来解决,比如SortedList<char, Sorted<char, List<string>> 这样就构成了2层结构,可以把字符串的第一个和第二个字母作为字典的Key,这样一下子可以把检索的数据量下降2个数量级都不止。
当然,在现实应用中可能存放的不是List<string>而是一个List<Entity>,这个Entity里面可能有N个属性,我们可能需要检索的就不止是一个字段这么简单了,可能需要为了检索Entity中的ID属性做个Dictionary<int, Entity>,也可能需要为了检索其中的Name属性做一个Dictionary<char, List<Entity>>,这就需要多份字典。
前面说过了,这个原始数据List<string>占用100M内存,那么你可能会想了,再来一个SortedList<char, Sorted<char, List<string>>那么就需要200M内存了,如果多份字典的话,更占内存?但是想想字典结构的效率真是高啊,怎么取舍呢?其实,如果你试验一下的话可以发现,再弄个SortedList<char, Sorted<char, List<string>> 可能只会占用1M内存,加起来一共是101M而不是200M,这是为什么呢?
记得引用类型和值类型的区别吗,如果你的数据结构大部分是引用类型,比如string的话,一个string的List,它其实存放了N个处于托管堆上的string的指针,那么如果我们再来一个字典结构的话,不是说我们就多存放了这些string,而是多存放了一套指针,外加Key所占用的一些空间。所以,遇到这种情况不用吝啬多一些字典结构来提高效率。
赞助商链接