daily pastebin goal
16%
SHARE
TWEET

Untitled

a guest Jan 19th, 2019 81 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using BenchmarkDotNet.Attributes;
  3. using BenchmarkDotNet.Running;
  4.  
  5. namespace BranchmarkString
  6. {
  7.     [CoreJob]
  8.     [MemoryDiagnoser, DisassemblyDiagnoser(printAsm: true, printSource: true)]
  9.     [RankColumn]
  10.     public class Benchmark
  11.     {
  12.         private static readonly string _encode32Chars = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
  13.         private static readonly char[] _encode32CharsArray = "0123456789ABCDEFGHIJKLMNOPQRSTUV".ToCharArray();
  14.  
  15.         private readonly long _id = DateTime.UtcNow.Ticks;
  16.  
  17.         [Benchmark(Baseline = true)]
  18.         public unsafe string V1()
  19.         {
  20.             var id = _id;
  21.  
  22.             char* buffer = stackalloc char[13];
  23.             buffer[0] = _encode32Chars[(int)(id >> 60) & 31];
  24.             buffer[1] = _encode32Chars[(int)(id >> 55) & 31];
  25.             buffer[2] = _encode32Chars[(int)(id >> 50) & 31];
  26.             buffer[3] = _encode32Chars[(int)(id >> 45) & 31];
  27.             buffer[4] = _encode32Chars[(int)(id >> 40) & 31];
  28.             buffer[5] = _encode32Chars[(int)(id >> 35) & 31];
  29.             buffer[6] = _encode32Chars[(int)(id >> 30) & 31];
  30.             buffer[7] = _encode32Chars[(int)(id >> 25) & 31];
  31.             buffer[8] = _encode32Chars[(int)(id >> 20) & 31];
  32.             buffer[9] = _encode32Chars[(int)(id >> 15) & 31];
  33.             buffer[10] = _encode32Chars[(int)(id >> 10) & 31];
  34.             buffer[11] = _encode32Chars[(int)(id >> 5) & 31];
  35.             buffer[12] = _encode32Chars[(int)id & 31];
  36.             return new string(buffer, 0, 13);
  37.         }
  38.  
  39.         [Benchmark]
  40.         public string V2()
  41.         {
  42.             var id = _id;
  43.  
  44.             Span<char> buffer = stackalloc char[13];
  45.  
  46.             buffer[0] = _encode32Chars[(int)(id >> 60) & 31];
  47.             buffer[1] = _encode32Chars[(int)(id >> 55) & 31];
  48.             buffer[2] = _encode32Chars[(int)(id >> 50) & 31];
  49.             buffer[3] = _encode32Chars[(int)(id >> 45) & 31];
  50.             buffer[4] = _encode32Chars[(int)(id >> 40) & 31];
  51.             buffer[5] = _encode32Chars[(int)(id >> 35) & 31];
  52.             buffer[6] = _encode32Chars[(int)(id >> 30) & 31];
  53.             buffer[7] = _encode32Chars[(int)(id >> 25) & 31];
  54.             buffer[8] = _encode32Chars[(int)(id >> 20) & 31];
  55.             buffer[9] = _encode32Chars[(int)(id >> 15) & 31];
  56.             buffer[10] = _encode32Chars[(int)(id >> 10) & 31];
  57.             buffer[11] = _encode32Chars[(int)(id >> 5) & 31];
  58.             buffer[12] = _encode32Chars[(int)id & 31];
  59.  
  60.             return new string(buffer);
  61.         }
  62.  
  63.         [Benchmark]
  64.         public string V3()
  65.         {
  66.             return string.Create(13, _id, (buffer, id) =>
  67.             {
  68.                 buffer[0] = _encode32Chars[(int)(id >> 60) & 31];
  69.                 buffer[1] = _encode32Chars[(int)(id >> 55) & 31];
  70.                 buffer[2] = _encode32Chars[(int)(id >> 50) & 31];
  71.                 buffer[3] = _encode32Chars[(int)(id >> 45) & 31];
  72.                 buffer[4] = _encode32Chars[(int)(id >> 40) & 31];
  73.                 buffer[5] = _encode32Chars[(int)(id >> 35) & 31];
  74.                 buffer[6] = _encode32Chars[(int)(id >> 30) & 31];
  75.                 buffer[7] = _encode32Chars[(int)(id >> 25) & 31];
  76.                 buffer[8] = _encode32Chars[(int)(id >> 20) & 31];
  77.                 buffer[9] = _encode32Chars[(int)(id >> 15) & 31];
  78.                 buffer[10] = _encode32Chars[(int)(id >> 10) & 31];
  79.                 buffer[11] = _encode32Chars[(int)(id >> 5) & 31];
  80.                 buffer[12] = _encode32Chars[(int)id & 31];
  81.             });
  82.         }
  83.  
  84.         [Benchmark]
  85.         public string V4()
  86.         {
  87.             return string.Create(13, _id, (buffer, id) =>
  88.             {
  89.                 buffer[12] = _encode32Chars[(int)id & 31];
  90.                 buffer[11] = _encode32Chars[(int)(id >> 5) & 31];
  91.                 buffer[10] = _encode32Chars[(int)(id >> 10) & 31];
  92.                 buffer[9] = _encode32Chars[(int)(id >> 15) & 31];
  93.                 buffer[8] = _encode32Chars[(int)(id >> 20) & 31];
  94.                 buffer[7] = _encode32Chars[(int)(id >> 25) & 31];
  95.                 buffer[6] = _encode32Chars[(int)(id >> 30) & 31];
  96.                 buffer[5] = _encode32Chars[(int)(id >> 35) & 31];
  97.                 buffer[4] = _encode32Chars[(int)(id >> 40) & 31];
  98.                 buffer[3] = _encode32Chars[(int)(id >> 45) & 31];
  99.                 buffer[2] = _encode32Chars[(int)(id >> 50) & 31];
  100.                 buffer[1] = _encode32Chars[(int)(id >> 55) & 31];
  101.                 buffer[0] = _encode32Chars[(int)(id >> 60) & 31];
  102.             });
  103.         }
  104.  
  105.         [Benchmark]
  106.         public string V5()
  107.         {
  108.             return string.Create(13, _id, (buffer, id) =>
  109.             {
  110.                 var encode32Chars = _encode32Chars;
  111.                 buffer[12] = encode32Chars[(int)id & 31];
  112.                 buffer[11] = encode32Chars[(int)(id >> 5) & 31];
  113.                 buffer[10] = encode32Chars[(int)(id >> 10) & 31];
  114.                 buffer[9] = encode32Chars[(int)(id >> 15) & 31];
  115.                 buffer[8] = encode32Chars[(int)(id >> 20) & 31];
  116.                 buffer[7] = encode32Chars[(int)(id >> 25) & 31];
  117.                 buffer[6] = encode32Chars[(int)(id >> 30) & 31];
  118.                 buffer[5] = encode32Chars[(int)(id >> 35) & 31];
  119.                 buffer[4] = encode32Chars[(int)(id >> 40) & 31];
  120.                 buffer[3] = encode32Chars[(int)(id >> 45) & 31];
  121.                 buffer[2] = encode32Chars[(int)(id >> 50) & 31];
  122.                 buffer[1] = encode32Chars[(int)(id >> 55) & 31];
  123.                 buffer[0] = encode32Chars[(int)(id >> 60) & 31];
  124.             });
  125.         }
  126.  
  127.         [Benchmark]
  128.         public string V6()
  129.         {
  130.             return string.Create(13, _id, (buffer, id) =>
  131.             {
  132.                 var encode32CharsArray = _encode32CharsArray;
  133.                 buffer[12] = encode32CharsArray[id & 31];
  134.                 buffer[11] = encode32CharsArray[(id >> 5) & 31];
  135.                 buffer[10] = encode32CharsArray[(id >> 10) & 31];
  136.                 buffer[9] = encode32CharsArray[(id >> 15) & 31];
  137.                 buffer[8] = encode32CharsArray[(id >> 20) & 31];
  138.                 buffer[7] = encode32CharsArray[(id >> 25) & 31];
  139.                 buffer[6] = encode32CharsArray[(id >> 30) & 31];
  140.                 buffer[5] = encode32CharsArray[(id >> 35) & 31];
  141.                 buffer[4] = encode32CharsArray[(id >> 40) & 31];
  142.                 buffer[3] = encode32CharsArray[(id >> 45) & 31];
  143.                 buffer[2] = encode32CharsArray[(id >> 50) & 31];
  144.                 buffer[1] = encode32CharsArray[(id >> 55) & 31];
  145.                 buffer[0] = encode32CharsArray[(id >> 60) & 31];
  146.             });
  147.         }
  148.     }
  149.  
  150.     class Program
  151.     {
  152.         public static void Main()
  153.         {
  154.             var summary = BenchmarkRunner.Run<Benchmark>();
  155.         }
  156.     }
  157. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top