You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

StructCastBenchmark.cs 1.9 kB

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using BenchmarkDotNet.Attributes;
  2. using System;
  3. using System.Runtime.CompilerServices;
  4. using System.Runtime.InteropServices;
  5. namespace TensorFlowBenchmark.Unmanaged
  6. {
  7. public struct UnmanagedStruct
  8. {
  9. public int a;
  10. public long b;
  11. public UnmanagedStruct(int _)
  12. {
  13. a = 2;
  14. b = 3;
  15. }
  16. }
  17. [SimpleJob(launchCount: 1, warmupCount: 2)]
  18. [MinColumn, MaxColumn, MeanColumn, MedianColumn]
  19. public unsafe class StructCastBenchmark
  20. {
  21. private static void EnsureIsUnmanaged<T>(T _) where T : unmanaged
  22. { }
  23. static StructCastBenchmark() //if UnmanagedStruct is not unmanaged struct then this will fail to compile.
  24. => EnsureIsUnmanaged(new UnmanagedStruct());
  25. private IntPtr data;
  26. private void* dataptr;
  27. [GlobalSetup]
  28. public void Setup()
  29. {
  30. data = Marshal.AllocHGlobal(Marshal.SizeOf<UnmanagedStruct>());
  31. dataptr = data.ToPointer();
  32. }
  33. [Benchmark, MethodImpl(MethodImplOptions.NoOptimization)]
  34. public void Marshal_PtrToStructure()
  35. {
  36. UnmanagedStruct _;
  37. for (int i = 0; i < 10000; i++)
  38. {
  39. _ = Marshal.PtrToStructure<UnmanagedStruct>(data);
  40. }
  41. }
  42. [Benchmark, MethodImpl(MethodImplOptions.NoOptimization)]
  43. public void PointerCast()
  44. {
  45. var dptr = dataptr;
  46. UnmanagedStruct _;
  47. for (int i = 0; i < 10000; i++)
  48. {
  49. _ = *(UnmanagedStruct*)dptr;
  50. }
  51. }
  52. [Benchmark, MethodImpl(MethodImplOptions.NoOptimization)]
  53. public void Unsafe_Read()
  54. {
  55. var dptr = dataptr;
  56. UnmanagedStruct _;
  57. for (int i = 0; i < 10000; i++)
  58. {
  59. _ = Unsafe.Read<UnmanagedStruct>(dptr);
  60. }
  61. }
  62. }
  63. }