SHARE
TWEET

Untitled




Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
- using System;
- using BenchmarkDotNet.Attributes;
- using BenchmarkDotNet.Running;
- namespace BranchmarkString
- {
- [CoreJob]
- [MemoryDiagnoser, DisassemblyDiagnoser(printAsm: true, printSource: true)]
- [RankColumn]
- public class Benchmark
- {
- private static readonly string _encode32Chars = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
- private static readonly char[] _encode32CharsArray = "0123456789ABCDEFGHIJKLMNOPQRSTUV".ToCharArray();
- private readonly long _id = DateTime.UtcNow.Ticks;
- [Benchmark(Baseline = true)]
- public unsafe string V1()
- {
- var id = _id;
- char* buffer = stackalloc char[13];
- buffer[0] = _encode32Chars[(int)(id >> 60) & 31];
- buffer[1] = _encode32Chars[(int)(id >> 55) & 31];
- buffer[2] = _encode32Chars[(int)(id >> 50) & 31];
- buffer[3] = _encode32Chars[(int)(id >> 45) & 31];
- buffer[4] = _encode32Chars[(int)(id >> 40) & 31];
- buffer[5] = _encode32Chars[(int)(id >> 35) & 31];
- buffer[6] = _encode32Chars[(int)(id >> 30) & 31];
- buffer[7] = _encode32Chars[(int)(id >> 25) & 31];
- buffer[8] = _encode32Chars[(int)(id >> 20) & 31];
- buffer[9] = _encode32Chars[(int)(id >> 15) & 31];
- buffer[10] = _encode32Chars[(int)(id >> 10) & 31];
- buffer[11] = _encode32Chars[(int)(id >> 5) & 31];
- buffer[12] = _encode32Chars[(int)id & 31];
- return new string(buffer, 0, 13);
- }
- [Benchmark]
- public string V2()
- {
- var id = _id;
- Span<char> buffer = stackalloc char[13];
- buffer[0] = _encode32Chars[(int)(id >> 60) & 31];
- buffer[1] = _encode32Chars[(int)(id >> 55) & 31];
- buffer[2] = _encode32Chars[(int)(id >> 50) & 31];
- buffer[3] = _encode32Chars[(int)(id >> 45) & 31];
- buffer[4] = _encode32Chars[(int)(id >> 40) & 31];
- buffer[5] = _encode32Chars[(int)(id >> 35) & 31];
- buffer[6] = _encode32Chars[(int)(id >> 30) & 31];
- buffer[7] = _encode32Chars[(int)(id >> 25) & 31];
- buffer[8] = _encode32Chars[(int)(id >> 20) & 31];
- buffer[9] = _encode32Chars[(int)(id >> 15) & 31];
- buffer[10] = _encode32Chars[(int)(id >> 10) & 31];
- buffer[11] = _encode32Chars[(int)(id >> 5) & 31];
- buffer[12] = _encode32Chars[(int)id & 31];
- return new string(buffer);
- }
- [Benchmark]
- public string V3()
- {
- return string.Create(13, _id, (buffer, id) =>
- {
- buffer[0] = _encode32Chars[(int)(id >> 60) & 31];
- buffer[1] = _encode32Chars[(int)(id >> 55) & 31];
- buffer[2] = _encode32Chars[(int)(id >> 50) & 31];
- buffer[3] = _encode32Chars[(int)(id >> 45) & 31];
- buffer[4] = _encode32Chars[(int)(id >> 40) & 31];
- buffer[5] = _encode32Chars[(int)(id >> 35) & 31];
- buffer[6] = _encode32Chars[(int)(id >> 30) & 31];
- buffer[7] = _encode32Chars[(int)(id >> 25) & 31];
- buffer[8] = _encode32Chars[(int)(id >> 20) & 31];
- buffer[9] = _encode32Chars[(int)(id >> 15) & 31];
- buffer[10] = _encode32Chars[(int)(id >> 10) & 31];
- buffer[11] = _encode32Chars[(int)(id >> 5) & 31];
- buffer[12] = _encode32Chars[(int)id & 31];
- });
- }
- [Benchmark]
- public string V4()
- {
- return string.Create(13, _id, (buffer, id) =>
- {
- buffer[12] = _encode32Chars[(int)id & 31];
- buffer[11] = _encode32Chars[(int)(id >> 5) & 31];
- buffer[10] = _encode32Chars[(int)(id >> 10) & 31];
- buffer[9] = _encode32Chars[(int)(id >> 15) & 31];
- buffer[8] = _encode32Chars[(int)(id >> 20) & 31];
- buffer[7] = _encode32Chars[(int)(id >> 25) & 31];
- buffer[6] = _encode32Chars[(int)(id >> 30) & 31];
- buffer[5] = _encode32Chars[(int)(id >> 35) & 31];
- buffer[4] = _encode32Chars[(int)(id >> 40) & 31];
- buffer[3] = _encode32Chars[(int)(id >> 45) & 31];
- buffer[2] = _encode32Chars[(int)(id >> 50) & 31];
- buffer[1] = _encode32Chars[(int)(id >> 55) & 31];
- buffer[0] = _encode32Chars[(int)(id >> 60) & 31];
- });
- }
- [Benchmark]
- public string V5()
- {
- return string.Create(13, _id, (buffer, id) =>
- {
- var encode32Chars = _encode32Chars;
- buffer[12] = encode32Chars[(int)id & 31];
- buffer[11] = encode32Chars[(int)(id >> 5) & 31];
- buffer[10] = encode32Chars[(int)(id >> 10) & 31];
- buffer[9] = encode32Chars[(int)(id >> 15) & 31];
- buffer[8] = encode32Chars[(int)(id >> 20) & 31];
- buffer[7] = encode32Chars[(int)(id >> 25) & 31];
- buffer[6] = encode32Chars[(int)(id >> 30) & 31];
- buffer[5] = encode32Chars[(int)(id >> 35) & 31];
- buffer[4] = encode32Chars[(int)(id >> 40) & 31];
- buffer[3] = encode32Chars[(int)(id >> 45) & 31];
- buffer[2] = encode32Chars[(int)(id >> 50) & 31];
- buffer[1] = encode32Chars[(int)(id >> 55) & 31];
- buffer[0] = encode32Chars[(int)(id >> 60) & 31];
- });
- }
- [Benchmark]
- public string V6()
- {
- return string.Create(13, _id, (buffer, id) =>
- {
- var encode32CharsArray = _encode32CharsArray;
- buffer[12] = encode32CharsArray[id & 31];
- buffer[11] = encode32CharsArray[(id >> 5) & 31];
- buffer[10] = encode32CharsArray[(id >> 10) & 31];
- buffer[9] = encode32CharsArray[(id >> 15) & 31];
- buffer[8] = encode32CharsArray[(id >> 20) & 31];
- buffer[7] = encode32CharsArray[(id >> 25) & 31];
- buffer[6] = encode32CharsArray[(id >> 30) & 31];
- buffer[5] = encode32CharsArray[(id >> 35) & 31];
- buffer[4] = encode32CharsArray[(id >> 40) & 31];
- buffer[3] = encode32CharsArray[(id >> 45) & 31];
- buffer[2] = encode32CharsArray[(id >> 50) & 31];
- buffer[1] = encode32CharsArray[(id >> 55) & 31];
- buffer[0] = encode32CharsArray[(id >> 60) & 31];
- });
- }
- }
- class Program
- {
- public static void Main()
- {
- var summary = BenchmarkRunner.Run<Benchmark>();
- }
- }
- }
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.