Created
May 5, 2018 23:51
-
-
Save bbowyersmyth/0523d23a9fb1ff2e2589cc74e92d2a35 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using BenchmarkDotNet.Attributes; | |
using BenchmarkDotNet.Attributes.Jobs; | |
using System; | |
namespace ConsoleApp2 | |
{ | |
[InProcess] | |
public unsafe class IsAscii | |
{ | |
private string _earlyCachedA = "1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU"; | |
private string _earlyCachedB = "2abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU"; | |
private string _lateCachedA = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU1"; | |
private string _lateCachedB = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU2"; | |
private string _earlyUnicodeCachedA = "1👍abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU"; | |
private string _earlyUnicodeCachedB = "2👍abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU"; | |
private string _lateUnicodeCachedA = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU👍1"; | |
private string _lateUnicodeCachedB = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU👍2"; | |
private string _earlyClearedA = "3abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU"; | |
private string _earlyClearedB = "4abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU"; | |
private string _lateClearedA = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU3"; | |
private string _lateClearedB = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU4"; | |
private string _earlyUnicodeClearedA = "3👍abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU"; | |
private string _earlyUnicodeClearedB = "4👍abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU"; | |
private string _lateUnicodeClearedA = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU👍3"; | |
private string _lateUnicodeClearedB = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU👍4"; | |
[GlobalSetup] | |
public void Setup() | |
{ | |
string.Compare(_earlyCachedA, _earlyCachedB, StringComparison.OrdinalIgnoreCase); | |
string.Compare(_lateCachedA, _lateCachedB, StringComparison.OrdinalIgnoreCase); | |
} | |
public unsafe void InvocationSetup() | |
{ | |
fixed (char* pcleared = _earlyClearedA) | |
{ | |
*(ulong*)(pcleared - sizeof(ulong)) = *(ulong*)(pcleared - sizeof(ulong)) & 0xFFFFFFFF0FFFFFFF; | |
} | |
fixed (char* pcleared = _earlyClearedB) | |
{ | |
*(ulong*)(pcleared - sizeof(ulong)) = *(ulong*)(pcleared - sizeof(ulong)) & 0xFFFFFFFF0FFFFFFF; | |
} | |
fixed (char* pcleared = _lateClearedA) | |
{ | |
*(ulong*)(pcleared - sizeof(ulong)) = *(ulong*)(pcleared - sizeof(ulong)) & 0xFFFFFFFF0FFFFFFF; | |
} | |
fixed (char* pcleared = _lateClearedB) | |
{ | |
*(ulong*)(pcleared - sizeof(ulong)) = *(ulong*)(pcleared - sizeof(ulong)) & 0xFFFFFFFF0FFFFFFF; | |
} | |
fixed (char* pcleared = _earlyUnicodeClearedA) | |
{ | |
*(ulong*)(pcleared - sizeof(ulong)) = *(ulong*)(pcleared - sizeof(ulong)) & 0xFFFFFFFF0FFFFFFF; | |
} | |
fixed (char* pcleared = _earlyUnicodeClearedB) | |
{ | |
*(ulong*)(pcleared - sizeof(ulong)) = *(ulong*)(pcleared - sizeof(ulong)) & 0xFFFFFFFF0FFFFFFF; | |
} | |
fixed (char* pcleared = _lateUnicodeClearedA) | |
{ | |
*(ulong*)(pcleared - sizeof(ulong)) = *(ulong*)(pcleared - sizeof(ulong)) & 0xFFFFFFFF0FFFFFFF; | |
} | |
fixed (char* pcleared = _lateUnicodeClearedB) | |
{ | |
*(ulong*)(pcleared - sizeof(ulong)) = *(ulong*)(pcleared - sizeof(ulong)) & 0xFFFFFFFF0FFFFFFF; | |
} | |
} | |
[Benchmark] | |
public int CompareEarlyExitBothCached() | |
{ | |
InvocationSetup(); | |
return string.Compare(_earlyCachedA, _earlyCachedB, StringComparison.OrdinalIgnoreCase); | |
} | |
[Benchmark] | |
public int CompareEarlyExitRightCached() | |
{ | |
InvocationSetup(); | |
return string.Compare(_earlyClearedA, _earlyCachedA, StringComparison.OrdinalIgnoreCase); | |
} | |
[Benchmark] | |
public int CompareEarlyExitLeftCached() | |
{ | |
InvocationSetup(); | |
return string.Compare(_earlyCachedA, _earlyClearedB, StringComparison.OrdinalIgnoreCase); | |
} | |
[Benchmark] | |
public unsafe int CompareEarlyExitNoCached() | |
{ | |
InvocationSetup(); | |
return string.Compare(_earlyClearedA, _earlyClearedB, StringComparison.OrdinalIgnoreCase); | |
} | |
[Benchmark] | |
public int CompareLateExitBothCached() | |
{ | |
InvocationSetup(); | |
return string.Compare(_lateCachedA, _lateCachedB, StringComparison.OrdinalIgnoreCase); | |
} | |
[Benchmark] | |
public int CompareLateExitRightCached() | |
{ | |
InvocationSetup(); | |
return string.Compare(_lateClearedA, _lateCachedA, StringComparison.OrdinalIgnoreCase); | |
} | |
[Benchmark] | |
public int CompareLateExitLeftCached() | |
{ | |
InvocationSetup(); | |
return string.Compare(_lateCachedA, _lateClearedB, StringComparison.OrdinalIgnoreCase); | |
} | |
[Benchmark] | |
public unsafe int CompareLateExitNoCached() | |
{ | |
InvocationSetup(); | |
return string.Compare(_lateClearedA, _lateClearedB, StringComparison.OrdinalIgnoreCase); | |
} | |
// Unicode | |
[Benchmark] | |
public int CompareUnicodeEarlyExitBothCached() | |
{ | |
InvocationSetup(); | |
return string.Compare(_earlyUnicodeCachedA, _earlyUnicodeCachedB, StringComparison.OrdinalIgnoreCase); | |
} | |
[Benchmark] | |
public int CompareUnicodeEarlyExitRightCached() | |
{ | |
InvocationSetup(); | |
return string.Compare(_earlyUnicodeClearedA, _earlyUnicodeCachedA, StringComparison.OrdinalIgnoreCase); | |
} | |
[Benchmark] | |
public int CompareUnicodeEarlyExitLeftCached() | |
{ | |
InvocationSetup(); | |
return string.Compare(_earlyUnicodeCachedA, _earlyUnicodeClearedB, StringComparison.OrdinalIgnoreCase); | |
} | |
[Benchmark] | |
public unsafe int CompareUnicodeEarlyExitNoCached() | |
{ | |
InvocationSetup(); | |
return string.Compare(_earlyUnicodeClearedA, _earlyUnicodeClearedB, StringComparison.OrdinalIgnoreCase); | |
} | |
[Benchmark] | |
public int CompareUnicodeLateExitBothCached() | |
{ | |
InvocationSetup(); | |
return string.Compare(_lateUnicodeCachedA, _lateUnicodeCachedB, StringComparison.OrdinalIgnoreCase); | |
} | |
[Benchmark] | |
public int CompareUnicodeLateExitRightCached() | |
{ | |
InvocationSetup(); | |
return string.Compare(_lateUnicodeClearedA, _lateUnicodeCachedA, StringComparison.OrdinalIgnoreCase); | |
} | |
[Benchmark] | |
public int CompareUnicodeLateExitLeftCached() | |
{ | |
InvocationSetup(); | |
return string.Compare(_lateUnicodeCachedA, _lateUnicodeClearedB, StringComparison.OrdinalIgnoreCase); | |
} | |
[Benchmark] | |
public unsafe int CompareUnicodeLateExitNoCached() | |
{ | |
InvocationSetup(); | |
return string.Compare(_lateUnicodeClearedA, _lateUnicodeClearedB, StringComparison.OrdinalIgnoreCase); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment