118 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 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?);
 | |
|         }
 | |
|     }
 | |
| } |