You need to enable JavaScript to run this app. bool类型输入x,y网格的类结构实现:当前写法是否高效?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.05 07:54:06