繁体   English   中英

Memory 高效类型存储 8 个字节和 2 个 ushort 值

[英]Memory efficient type to store 8 bytes and 2 ushort values

我需要创建一个行数组。 每行将包含八个 1 字节数字 (0-255) 和两个 2 字节 ushort 数字 (0-65535)。 我将在 memory 中同时保留数百万(如果不是数十亿)这样的行。如果我专注于优化 memory 的使用,那么用于构造此类行的最佳类型是什么? 我使用64位操作系统。

我在想简单的Tuple ,像这样:

new Tuple<byte[], ushort, ushort>(byteArray, 1, 2);

或结构:

public struct Row
{
    public Row(byte[] bytes, ushort val1, ushort val2)
    {
        Bytes = bytes;
        Val1 = val1;
        Val2 = val2;
    }

    public byte[] Bytes { get; set; } = new byte[8];
    public ushort Val1 { get; set; }
    public ushort Val2 { get; set; }
}

或结构,但没有字节数组? 像这样:

public struct Row
{
    public byte B1 { get; set; }
    public byte B2 { get; set; }
    public byte B3 { get; set; }
    public byte B4 { get; set; }
    public byte B5 { get; set; }
    public byte B6 { get; set; }
    public byte B7 { get; set; }
    public byte B8 { get; set; }

    public ushort Val1 { get; set; }
    public ushort Val2 { get; set; }
}

我认为数据本身将占用 12 个字节(或者 16 个字节?)。 但我不确定 memory 将用于我不知道的其他内容。 比如数组长度? 我应该使用List而不是数组吗?

我应该避免使用数组,并将每个字节存储在单独的属性中吗?

我应该使用int而不是ushort吗? 如果无论如何一行都需要 16 个字节,那么将int用于 Val1 和 Val2 不是更好吗?

需要注意的是,一旦创建了这个包含数十亿行的列表,稍后将在算法中更改/更新一些值。 不确定为此选择完美类型是否重要。

感谢您的建议和帮助!

最后一个选项看起来是最有效的。 如果你想让它像有一个数组一样工作,你可以试试这个:

struct A {
    private ulong bytes;
    // allows you to access the bytes like this is an array
    public byte this[int i] {
        get => (byte)(bytes >> (i * 8));
        set {
            bytes &= ~(0b11111111 << (i * 8));
            bytes |= value << (i * 8);
        }
    }
    public ushort ushort1;
    public ushort ushort2;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM