- 积分
- 13326
- 明经币
- 个
- 注册时间
- 2015-8-18
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 你有种再说一遍 于 2025-3-21 18:15 编辑
看过一些人写xml很喜欢用ElementAt(targetNum)
包括会用于dictionary这些没有随机访问的,
实际上用这个东西很不好,它是O(n)的,
也就是
int targetNum = 5;
int i = 0;
foreach(var item in xmlNodes) {
if (i == targetNum) {
task(item);
break;
}
i++;
}
第二次搜索,那就又从头循环一次了.
第三次搜索,那就又从头循环一次了.
...
对于这种处理手法有几种.
1,如果ElementAt的对象有多次随机访问的需求,
直接var list = dict.ToList();
然后list[j]就得了.
2,直接反序列化xml成类,
类里面就是O(1)寻址速度了.
缺点是如果配置文件很大的话,比较占内存.
3,首先第一次搜索指定节点名,
边搜边存map[节点名]=内容.
搜到直接break.
然后我们就赌一个命中概率,
如果map里面有,直接取map的value内容,
如果没有,我们再进行遍历其他节点,可以记录一个上次中断位置.
如果文件更新,我们通过文件更改事件清理缓存.
然后你可以很容易想到如何淘汰内存呢?
这样不就是LRU算法嘛,
这样我们每次储存几十个节点内容,
然后活跃的置顶,不活跃的淘汰掉
xx |
|