Guest User

Untitled

a guest
Jul 18th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.65 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Runtime.CompilerServices;
  5. using System.Runtime.Intrinsics.X86;
  6. using BenchmarkDotNet.Attributes;
  7. using BenchmarkDotNet.Columns;
  8. using BenchmarkDotNet.Configs;
  9. using BenchmarkDotNet.Jobs;
  10. using BenchmarkDotNet.Reports;
  11. using BenchmarkDotNet.Running;
  12.  
  13. class Program
  14. {
  15. public static void Main()
  16. {
  17. BenchmarkRunner.Run<CountDigitsBenchmark>(new LocalCoreClrConfig());
  18. }
  19. }
  20.  
  21.  
  22. public class CountDigitsBenchmark
  23. {
  24. [Params(0ul, 0xAul, 0x42ul, 0x123ul, 0xDEADF00ul, 0xDEADF00D12345ul)]
  25. public ulong Number { get; set; }
  26.  
  27. [Benchmark]
  28. public int CountHexDigits_original() => CountHexDigits_original(Number);
  29.  
  30. [Benchmark(Baseline = true)]
  31. public int CountHexDigits_Lzcnt_shifts() => CountHexDigits_Lzcnt_shifts(Number);
  32.  
  33.  
  34. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  35. public static int CountHexDigits_Lzcnt_shifts(ulong value)
  36. {
  37. if (Lzcnt.IsSupported)
  38. {
  39. var right = 64 - (int)Lzcnt.LeadingZeroCount(value | 1);
  40. return (right + 3) >> 2;
  41. }
  42.  
  43. int digits = 1;
  44.  
  45. if (value > 0xFFFFFFFF)
  46. {
  47. digits += 8;
  48. value >>= 0x20;
  49. }
  50. if (value > 0xFFFF)
  51. {
  52. digits += 4;
  53. value >>= 0x10;
  54. }
  55. if (value > 0xFF)
  56. {
  57. digits += 2;
  58. value >>= 0x8;
  59. }
  60. if (value > 0xF)
  61. digits++;
  62.  
  63. return digits;
  64. }
  65.  
  66. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  67. public static int CountHexDigits_original(ulong value)
  68. {
  69. int digits = 1;
  70.  
  71. if (value > 0xFFFFFFFF)
  72. {
  73. digits += 8;
  74. value >>= 0x20;
  75. }
  76. if (value > 0xFFFF)
  77. {
  78. digits += 4;
  79. value >>= 0x10;
  80. }
  81. if (value > 0xFF)
  82. {
  83. digits += 2;
  84. value >>= 0x8;
  85. }
  86. if (value > 0xF)
  87. digits++;
  88.  
  89. return digits;
  90. }
  91. }
Add Comment
Please, Sign In to add comment