initial commit
This commit is contained in:
118
TrailingNumberFromString.cs
Normal file
118
TrailingNumberFromString.cs
Normal file
@@ -0,0 +1,118 @@
|
||||
using System;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Text.RegularExpressions;
|
||||
using BenchmarkDotNet.Attributes;
|
||||
|
||||
namespace Benchmark
|
||||
{
|
||||
[MemoryDiagnoser]
|
||||
public class TrailingNumberFromString
|
||||
{
|
||||
private readonly Regex _regex = new Regex(@"^\d$", RegexOptions.Compiled);
|
||||
|
||||
[Benchmark]
|
||||
public int? GetTrailingNumberFromString1()
|
||||
{
|
||||
const string foo = "Test1234";
|
||||
string sValue = null;
|
||||
|
||||
for (var i = foo.Length - 1; i >= 0; i--)
|
||||
{
|
||||
var regex = new Regex(@"^\d$");
|
||||
|
||||
if (regex.IsMatch(foo[i].ToString()))
|
||||
sValue = foo[i] + sValue;
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
if (sValue != null)
|
||||
return Convert.ToInt32(sValue);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
[Benchmark]
|
||||
public int? GetTrailingNumberFromString2()
|
||||
{
|
||||
const string foo = "Test1234";
|
||||
string sValue = null;
|
||||
|
||||
for (var i = foo.Length - 1; i >= 0; i--)
|
||||
{
|
||||
if (_regex.IsMatch(foo[i].ToString()))
|
||||
sValue = foo[i] + sValue;
|
||||
else
|
||||
break;
|
||||
}
|
||||
if (sValue != null)
|
||||
return Convert.ToInt32(sValue);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
[Benchmark]
|
||||
public int? GetTrailingNumberFromString3()
|
||||
{
|
||||
const string foo = "Test1234";
|
||||
var result = 0;
|
||||
|
||||
for (var i = foo.Length - 1; i >= 0; i--)
|
||||
{
|
||||
if (foo[i] >= 48 && foo[i] <= 58)
|
||||
{
|
||||
var value = foo[i] - 48;
|
||||
result += value * (int) Math.Pow(10, foo.Length - i - 1);
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
[Benchmark]
|
||||
public int? GetTrailingNumberFromString4()
|
||||
{
|
||||
const string foo = "Test1234";
|
||||
var result = 0;
|
||||
|
||||
for (var i = foo.Length - 1; i >= 0; i--)
|
||||
{
|
||||
if (foo[i] >= 48 && foo[i] <= 58)
|
||||
{
|
||||
var value = foo[i] - 48;
|
||||
result += value * IntegerPow(10, foo.Length - i - 1);
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static int IntegerPow(int x, int y)
|
||||
{
|
||||
if (y == 0) return 1;
|
||||
var result = x;
|
||||
for (var i = 1; i < y; i++)
|
||||
{
|
||||
result *= x;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
[Benchmark]
|
||||
public int? GetTrailingNumberFromString5()
|
||||
{
|
||||
const string foo = "Test1234";
|
||||
var regex = new Regex(@"\d+$");
|
||||
var match = regex.Match(foo);
|
||||
return match.Success && int.TryParse(match.Value, out var result) ? result : default(int?);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user