bool类型输入x,y网格的类结构实现:当前写法是否高效?
现有实现方案的核心缺陷
你目前采用的嵌套硬编码属性写法,完全算不上高效方案,存在三个硬伤:
- 扩展性极差:硬编码写死10个
Timeband属性、每个Readers类写死10个reader属性,后续如果要调整网格规模(比如新增Timeband、新增Reader),必须手动修改类定义、重新编译程序,漏改一处就会引入难以排查的bug - 内存冗余极高:每个
Readers实例都是独立的堆对象,加上每个bool属性的内存对齐填充、属性访问器的元数据开销,这套10*10网格的实际内存占用,比理论存储值高5~10倍 - 访问效率极低:运行时如果需要根据timeband编号、reader编号动态取对应的值,没法直接做索引访问,要么写几十层switch-case分支,要么通过反射查找属性,性能损耗比直接索引低几个数量级
最优实现方案
根据性能需求不同,有两个成熟的落地方向:
追求极致零开销
因为你的网格是固定10*10=100个bool值,完全可以把所有值压缩存储在几个无符号整数的位空间里,整体做成值类型struct,没有任何堆分配开销,所有读写操作都是原生CPU位运算,访问延迟在纳秒级别:
public struct BoolGrid10x10 { // 100个布尔值拆为两个连续位段存储,无冗余 private ulong _lowerBits; // 存储前64个值 private uint _upperBits; // 存储剩余36个值 // 索引器:timebandIndex 取值范围0-9,readerIndex取值范围0-9 public bool this[int timebandIndex, int readerIndex] { get { int bitOffset = timebandIndex * 10 + readerIndex; return bitOffset < 64 ? (_lowerBits & (1ul << bitOffset)) != 0 : (_upperBits & (1u << (bitOffset - 64))) != 0; } set { int bitOffset = timebandIndex * 10 + readerIndex; if (bitOffset < 64) { _lowerBits = value ? _lowerBits | (1ul << bitOffset) : _lowerBits & ~(1ul << bitOffset); } else { int shiftedOffset = bitOffset - 64; _upperBits = value ? _upperBits | (1u << shiftedOffset) : _upperBits & ~(1u << shiftedOffset); } } } }
兼顾开发效率
如果不需要极致的位运算性能,直接用二维紧凑数组实现即可,代码量比原有嵌套类写法减少80%以上:
// 网格固定为10行(对应Timeband 0-9)、10列(对应Reader 0-9) private readonly bool[,] _grid = new bool[10, 10]; // 取值示例:获取Timeband2、Reader7的状态 -> _grid[2, 7] // 赋值示例:设置Timeband2、Reader7为true -> _grid[2, 7] = true
这种实现下,.NET会为bool数组分配连续紧凑的内存,1010的网格仅占100字节加少量数组头开销*,内存占用仅为原有嵌套类写法的1/10不到,访问速度和硬编码属性几乎没有差别,还能直接用两层循环做批量遍历,不需要手动枚举每一个硬编码属性。
内容的提问来源于stack exchange,提问作者A Houghton
相关产品推荐
相关产品推荐

