diff --git a/src/TensorFlowNet.Benchmarks/TensorFlowBenchmark.csproj b/src/TensorFlowNet.Benchmarks/TensorFlowBenchmark.csproj
index bc2a0ff3..4618f06b 100644
--- a/src/TensorFlowNet.Benchmarks/TensorFlowBenchmark.csproj
+++ b/src/TensorFlowNet.Benchmarks/TensorFlowBenchmark.csproj
@@ -6,6 +6,7 @@
true
TensorFlowBenchmark
TensorFlowBenchmark
+ 7.3
diff --git a/src/TensorFlowNet.Benchmarks/Unmanaged/StructCastBenchmark.cs b/src/TensorFlowNet.Benchmarks/Unmanaged/StructCastBenchmark.cs
new file mode 100644
index 00000000..5b3a0cd3
--- /dev/null
+++ b/src/TensorFlowNet.Benchmarks/Unmanaged/StructCastBenchmark.cs
@@ -0,0 +1,76 @@
+using System;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using BenchmarkDotNet.Attributes;
+using Google.Protobuf.WellKnownTypes;
+using NumSharp;
+using Tensorflow;
+using static Tensorflow.Binding;
+
+namespace TensorFlowBenchmark.Unmanaged
+{
+ public struct UnmanagedStruct
+ {
+ public int a;
+ public long b;
+ public UnmanagedStruct(int _)
+ {
+ a = 2;
+ b = 3;
+ }
+ }
+
+ [SimpleJob(launchCount: 1, warmupCount: 2, targetCount: 10)]
+ [MinColumn, MaxColumn, MeanColumn, MedianColumn]
+ public unsafe class StructCastBenchmark
+ {
+ private static void EnsureIsUnmanaged(T _) where T : unmanaged
+ { }
+
+ static StructCastBenchmark() //if UnmanagedStruct is not unmanaged struct then this will fail to compile.
+ => EnsureIsUnmanaged(new UnmanagedStruct());
+
+ private IntPtr data;
+ private void* dataptr;
+
+ [GlobalSetup]
+ public void Setup()
+ {
+ data = Marshal.AllocHGlobal(Marshal.SizeOf());
+ dataptr = data.ToPointer();
+ }
+
+ [Benchmark, MethodImpl(MethodImplOptions.NoOptimization)]
+ public void Marshal_PtrToStructure()
+ {
+ UnmanagedStruct _;
+ for (int i = 0; i < 10000; i++)
+ {
+ _ = Marshal.PtrToStructure(data);
+ }
+ }
+
+ [Benchmark, MethodImpl(MethodImplOptions.NoOptimization)]
+ public void PointerCast()
+ {
+ var dptr = dataptr;
+ UnmanagedStruct _;
+ for (int i = 0; i < 10000; i++)
+ {
+ _ = *(UnmanagedStruct*) dptr;
+ }
+ }
+
+ [Benchmark, MethodImpl(MethodImplOptions.NoOptimization)]
+ public void Unsafe_Read()
+ {
+ var dptr = dataptr;
+ UnmanagedStruct _;
+ for (int i = 0; i < 10000; i++)
+ {
+ _ = Unsafe.Read(dptr);
+ }
+ }
+
+ }
+}
\ No newline at end of file