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 2.1 kB

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