转换后续字节数组的最快方法是什么 - >类对象的集合

时间:2013-09-29 11:45:05

标签: c# pointers deserialization marshalling bit-shift

我有一个字节数组,可以包含数百万个字节,由以下结构表示:数组分为n个16字节的段。每个段的前8个字节表示long类型的值(8个字节),后跟2个值,每个类型为short(2 * 4个字节)。

我寻找将字节数组段转换为以下类型的类对象集合的绝对最快方法:

public class Foo
{
    public long Value1 { get; set; }
    public float Value2 { get; set; }
    public float Value3 { get; set; }

    public Foo(long value1, float value2, float value3)
    {
        Value1 = value1;
        Value2 = value2;
        Value3 = value3;
    }
}

到目前为止我尝试过的是使用BitConverter.ToInt64(...),...但是转换需要太长时间,因为我必须处理数百万字节和几百个大小的数组这样的数组。

var collection = new List<Foo>();
        var byteArraySize = byteArray.Count();
        for (var counter = 0; counter < byteArraySize; counter += PacketLength) //Packetlength here is 16
        {
            collection.Add(new Foo(
                               BitConverter.ToInt64(byteArray, counter),
                               BitConverter.ToSingle(byteArray, counter + 8),
                               BitConverter.ToSingle(byteArray, counter + 12)));
        }

有人可以告诉我如何应用位移逻辑来加速这个过程。使用指针逻辑的不安全代码也可以工作。

非常感谢。

1 个答案:

答案 0 :(得分:1)

以下代码需要4.668秒来处理我机器上的1 GiB数据,其中0.028秒用于转换数据,4.641秒用于创建Foo个对象。您的原始代码需要6.227秒。

unsafe Foo[] Load(byte[] buffer, int offset, int length)
{
    fixed (byte* ptr = buffer)
    {
        Data* data = (Data*)(ptr + offset);
        Foo[] result = new Foo[length / sizeof(Data)];
        for (int i = 0; i < result.Length; i++)
        {
            result[i] = new Foo(data);
            data++;
        }
        return result;
    }
}

struct Data
{
    public long Value1;
    public float Value2;
    public float Value3;
}

class Foo
{
    public long Value1 { get; set; }
    public float Value2 { get; set; }
    public float Value3 { get; set; }

    public unsafe Foo(Data* data)
    {
        Value1 = data->Value1;
        Value2 = data->Value2;
        Value3 = data->Value3;
    }
}