编辑
2024-08-14
C#
00
请注意,本文编写于 298 天前,最后修改于 298 天前,其中某些信息可能已经过时。

目录

创建测试结构体
测试函数
结果对比

创建测试结构体

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(); } }

结果对比

MethodMeanErrorStdDev
Method194.891 ms1.8537 ms3.4360 ms
Method26.625 ms0.0676 ms0.0599 ms

本文作者:chenxuejian

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!