我有一个字节数组,可以包含数百万个字节,由以下结构表示:数组分为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)));
}
有人可以告诉我如何应用位移逻辑来加速这个过程。使用指针逻辑的不安全代码也可以工作。
非常感谢。
答案 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;
}
}