明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 311|回复: 1

[运行时] cad.net 剔除ElementAt函数

[复制链接]
发表于 2025-3-21 03:35:12 | 显示全部楼层 |阅读模式
本帖最后由 你有种再说一遍 于 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
回复

使用道具 举报

 楼主| 发表于 2025-3-22 03:06:48 | 显示全部楼层
我才知道程序域是一个轻量级进程...
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-3-30 01:46 , Processed in 0.176652 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表