cs[StructLayout(LayoutKind.Sequential)]
public struct Point
{
public float X { get; set; }
public float Y { get; set; }
public float Z { get; set; }
}
这里使用Marshal.PtrToStructure、Span两种方式
cs public class Test
{
private readonly IntPtr data;
private const int count = 2000000;
public Test()
{
var points = new Point[count];
for (int i = 0; i < points.Length; i++)
{
points[i].X = i;
}
data = Marshal.AllocHGlobal(points.Length * Marshal.SizeOf(typeof(Point)));
var ptr = data;
for (int i = 0; i < points.Length; i++)
{
Marshal.StructureToPtr(points[i], ptr, false);
ptr += Marshal.SizeOf(typeof(Point));
}
}
[Benchmark]
public Point[] Method1()
{
var points = new Point[count];
var ptr = data;
for (int i = 0; i < count; i++)
{
points[i] = Marshal.PtrToStructure<Point>(ptr);
ptr += Marshal.SizeOf(typeof(Point));
}
return points;
}
[Benchmark]
public unsafe Point[] Method2()
{
var points = new Span<Point>(data.ToPointer(), count);
return points.ToArray();
}
}
Method | Mean | Error | StdDev |
---|---|---|---|
Method1 | 94.891 ms | 1.8537 ms | 3.4360 ms |
Method2 | 6.625 ms | 0.0676 ms | 0.0599 ms |
本文作者:chenxuejian
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!