Skip to content

Instantly share code, notes, and snippets.

@bbowyersmyth
Created May 5, 2018 23:51
Show Gist options
  • Save bbowyersmyth/0523d23a9fb1ff2e2589cc74e92d2a35 to your computer and use it in GitHub Desktop.
Save bbowyersmyth/0523d23a9fb1ff2e2589cc74e92d2a35 to your computer and use it in GitHub Desktop.
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