diff --git a/FuzzySharp/Extractor/ExtractedResult.cs b/FuzzySharp/Extractor/ExtractedResult.cs index 43f41e2..07dec7b 100644 --- a/FuzzySharp/Extractor/ExtractedResult.cs +++ b/FuzzySharp/Extractor/ExtractedResult.cs @@ -1,19 +1,15 @@ using System; -using System.Collections.Generic; namespace FuzzySharp.Extractor { - public class ExtractedResult : IComparable> + public struct ExtractedResult : IComparable> { + public T Value { get; } + public int Score { get; } + public int Index { get; } - public readonly T Value; - public readonly int Score; - public readonly int Index; - - public ExtractedResult(T value, int score) + public ExtractedResult(T value, int score) : this(value, score, 0) { - Value = value; - Score = score; } public ExtractedResult(T value, int score, int index) @@ -25,7 +21,7 @@ public ExtractedResult(T value, int score, int index) public int CompareTo(ExtractedResult other) { - return Comparer.Default.Compare(this.Score, other.Score); + return Score.CompareTo(other.Score); } public override string ToString() diff --git a/FuzzySharp/PreProcess/StringPreprocessorFactory.cs b/FuzzySharp/PreProcess/StringPreprocessorFactory.cs index 0cc5647..1a1fcfe 100644 --- a/FuzzySharp/PreProcess/StringPreprocessorFactory.cs +++ b/FuzzySharp/PreProcess/StringPreprocessorFactory.cs @@ -5,11 +5,14 @@ namespace FuzzySharp.PreProcess { internal class StringPreprocessorFactory { - private static string pattern = "[^ a-zA-Z0-9]"; + private static readonly Regex FullMatchRegex = new Regex("[^ a-zA-Z0-9]", RegexOptions.Compiled); + + private static readonly Func CacheDefault = Default; + private static readonly Func Ident = x => x; private static string Default(string input) { - input = Regex.Replace(input, pattern, " "); + input = FullMatchRegex.Replace(input, " ");; input = input.ToLower(); return input.Trim(); @@ -20,9 +23,9 @@ public static Func GetPreprocessor(PreprocessMode mode) switch (mode) { case PreprocessMode.Full: - return Default; + return CacheDefault; case PreprocessMode.None: - return s => s; + return Ident; default: throw new InvalidOperationException($"Invalid string preprocessor mode: {mode}"); } diff --git a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/Simple/DefaultRatioScorer.cs b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/Simple/DefaultRatioScorer.cs index 12ef6d1..0822ad4 100644 --- a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/Simple/DefaultRatioScorer.cs +++ b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/Simple/DefaultRatioScorer.cs @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive { public class DefaultRatioScorer : SimpleRatioScorerBase { - protected override Func Scorer => DefaultRatioStrategy.Calculate; + protected override Func Scorer => DefaultRatioStrategy.CacheCalculate; } } diff --git a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/Simple/PartialRatioScorer.cs b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/Simple/PartialRatioScorer.cs index 049d8af..b786f95 100644 --- a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/Simple/PartialRatioScorer.cs +++ b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/Simple/PartialRatioScorer.cs @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive { public class PartialRatioScorer : SimpleRatioScorerBase { - protected override Func Scorer => PartialRatioStrategy.Calculate; + protected override Func Scorer => PartialRatioStrategy.CacheCalculate; } } diff --git a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenAbbreviation/PartialTokenAbbreviationScorer.cs b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenAbbreviation/PartialTokenAbbreviationScorer.cs index 4812645..edb2f2d 100644 --- a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenAbbreviation/PartialTokenAbbreviationScorer.cs +++ b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenAbbreviation/PartialTokenAbbreviationScorer.cs @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive { public class PartialTokenAbbreviationScorer : TokenAbbreviationScorerBase { - protected override Func Scorer => PartialRatioStrategy.Calculate; + protected override Func Scorer => PartialRatioStrategy.CacheCalculate; } } diff --git a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenAbbreviation/TokenAbbreviationScorer.cs b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenAbbreviation/TokenAbbreviationScorer.cs index 847fec8..2654f5a 100644 --- a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenAbbreviation/TokenAbbreviationScorer.cs +++ b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenAbbreviation/TokenAbbreviationScorer.cs @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive { public class TokenAbbreviationScorer : TokenAbbreviationScorerBase { - protected override Func Scorer => DefaultRatioStrategy.Calculate; + protected override Func Scorer => DefaultRatioStrategy.CacheCalculate; } } diff --git a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenDifference/PartialTokenDifferenceScorer.cs b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenDifference/PartialTokenDifferenceScorer.cs index a216197..79aa679 100644 --- a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenDifference/PartialTokenDifferenceScorer.cs +++ b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenDifference/PartialTokenDifferenceScorer.cs @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive { public class PartialTokenDifferenceScorer : TokenDifferenceScorerBase { - protected override Func Scorer => PartialRatioStrategy.Calculate; + protected override Func Scorer => PartialRatioStrategy.CacheCalculate; } } diff --git a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenDifference/TokenDifferenceScorer.cs b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenDifference/TokenDifferenceScorer.cs index fc2bfb9..6798713 100644 --- a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenDifference/TokenDifferenceScorer.cs +++ b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenDifference/TokenDifferenceScorer.cs @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive { public class TokenDifferenceScorer : TokenDifferenceScorerBase { - protected override Func Scorer => DefaultRatioStrategy.Calculate; + protected override Func Scorer => DefaultRatioStrategy.CacheCalculate; } } diff --git a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenInitialism/PartialTokenInitialismScorer.cs b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenInitialism/PartialTokenInitialismScorer.cs index 1eda5b8..24bbc33 100644 --- a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenInitialism/PartialTokenInitialismScorer.cs +++ b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenInitialism/PartialTokenInitialismScorer.cs @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive { public class PartialTokenInitialismScorer : TokenInitialismScorerBase { - protected override Func Scorer => PartialRatioStrategy.Calculate; + protected override Func Scorer => PartialRatioStrategy.CacheCalculate; } } diff --git a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenInitialism/TokenInitialismScorer.cs b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenInitialism/TokenInitialismScorer.cs index 3ea2293..5988408 100644 --- a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenInitialism/TokenInitialismScorer.cs +++ b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenInitialism/TokenInitialismScorer.cs @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive { public class TokenInitialismScorer : TokenInitialismScorerBase { - protected override Func Scorer => DefaultRatioStrategy.Calculate; + protected override Func Scorer => DefaultRatioStrategy.CacheCalculate; } } diff --git a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenSet/PartialTokenSetScorer.cs b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenSet/PartialTokenSetScorer.cs index 1011eed..30d45d0 100644 --- a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenSet/PartialTokenSetScorer.cs +++ b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenSet/PartialTokenSetScorer.cs @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive { public class PartialTokenSetScorer : TokenSetScorerBase { - protected override Func Scorer => PartialRatioStrategy.Calculate; + protected override Func Scorer => PartialRatioStrategy.CacheCalculate; } } diff --git a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenSet/TokenSetScorer.cs b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenSet/TokenSetScorer.cs index fd88724..5c043b3 100644 --- a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenSet/TokenSetScorer.cs +++ b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenSet/TokenSetScorer.cs @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive { public class TokenSetScorer : TokenSetScorerBase { - protected override Func Scorer => DefaultRatioStrategy.Calculate; + protected override Func Scorer => DefaultRatioStrategy.CacheCalculate; } } diff --git a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenSort/PartialTokenSortScorer.cs b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenSort/PartialTokenSortScorer.cs index 5faa0e1..f8b2408 100644 --- a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenSort/PartialTokenSortScorer.cs +++ b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenSort/PartialTokenSortScorer.cs @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive { public class PartialTokenSortScorer : TokenSortScorerBase { - protected override Func Scorer => PartialRatioStrategy.Calculate; + protected override Func Scorer => PartialRatioStrategy.CacheCalculate; } } diff --git a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenSort/TokenSortAlgorithm.cs b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenSort/TokenSortAlgorithm.cs index dbfa10a..a584d6f 100644 --- a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenSort/TokenSortAlgorithm.cs +++ b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenSort/TokenSortAlgorithm.cs @@ -6,10 +6,12 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive { public abstract class TokenSortScorerBase : StrategySensitiveScorerBase { + private static readonly Regex SpaceRegex = new Regex(@"\s+", RegexOptions.Compiled); + public override int Score(string input1, string input2) { - var sorted1 = String.Join(" ", Regex.Split(input1, @"\s+").Where(s => s.Any()).OrderBy(s => s)).Trim(); - var sorted2 = String.Join(" ", Regex.Split(input2, @"\s+").Where(s => s.Any()).OrderBy(s => s)).Trim(); + var sorted1 = String.Join(" ", SpaceRegex.Split(input1).Where(s => s.Any()).OrderBy(s => s)).Trim(); + var sorted2 = String.Join(" ", SpaceRegex.Split(input2).Where(s => s.Any()).OrderBy(s => s)).Trim(); return Scorer(sorted1, sorted2); } diff --git a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenSort/TokenSortScorer.cs b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenSort/TokenSortScorer.cs index 8cd6821..23b7f77 100644 --- a/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenSort/TokenSortScorer.cs +++ b/FuzzySharp/SimilarityRatio/Scorer/StrategySensitive/TokenSort/TokenSortScorer.cs @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive { public class TokenSortScorer : TokenSortScorerBase { - protected override Func Scorer => DefaultRatioStrategy.Calculate; + protected override Func Scorer => DefaultRatioStrategy.CacheCalculate; } } diff --git a/FuzzySharp/SimilarityRatio/ScorerCache.cs b/FuzzySharp/SimilarityRatio/ScorerCache.cs index 34b405e..79b97d4 100644 --- a/FuzzySharp/SimilarityRatio/ScorerCache.cs +++ b/FuzzySharp/SimilarityRatio/ScorerCache.cs @@ -1,15 +1,19 @@ using System; using System.Collections.Concurrent; +using System.Runtime.CompilerServices; using FuzzySharp.SimilarityRatio.Scorer; namespace FuzzySharp.SimilarityRatio { public static class ScorerCache { - private static readonly ConcurrentDictionary s_scorerCache = new ConcurrentDictionary(); - public static IRatioScorer Get() where T : IRatioScorer, new() + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static IRatioScorer Get() where T : IRatioScorer, new() => GenericCache.Instance; + + private static class GenericCache + where T : IRatioScorer, new() { - return s_scorerCache.GetOrAdd(typeof(T), new T()); + public static readonly T Instance = new T(); } } } diff --git a/FuzzySharp/SimilarityRatio/Strategy/DefaultRatioStrategy.cs b/FuzzySharp/SimilarityRatio/Strategy/DefaultRatioStrategy.cs index 8e8fac2..b434c1d 100644 --- a/FuzzySharp/SimilarityRatio/Strategy/DefaultRatioStrategy.cs +++ b/FuzzySharp/SimilarityRatio/Strategy/DefaultRatioStrategy.cs @@ -4,6 +4,8 @@ namespace FuzzySharp.SimilarityRatio.Strategy { internal class DefaultRatioStrategy { + public static readonly Func CacheCalculate = Calculate; + public static int Calculate(string input1, string input2) { if (input1.Length == 0 || input2.Length == 0) diff --git a/FuzzySharp/SimilarityRatio/Strategy/Generic/DefaultRatioStrategyT.cs b/FuzzySharp/SimilarityRatio/Strategy/Generic/DefaultRatioStrategyT.cs index 2fdfb08..e1ab5d3 100644 --- a/FuzzySharp/SimilarityRatio/Strategy/Generic/DefaultRatioStrategyT.cs +++ b/FuzzySharp/SimilarityRatio/Strategy/Generic/DefaultRatioStrategyT.cs @@ -4,6 +4,8 @@ namespace FuzzySharp.SimilarityRatio.Strategy.Generic { internal class DefaultRatioStrategy where T : IEquatable { + public static readonly Func CacheCalculate = Calculate; + public static int Calculate(T[] input1, T[] input2) { if (input1.Length == 0 || input2.Length == 0) diff --git a/FuzzySharp/SimilarityRatio/Strategy/Generic/PartialRatioStrategyT.cs b/FuzzySharp/SimilarityRatio/Strategy/Generic/PartialRatioStrategyT.cs index a536da4..7b8d537 100644 --- a/FuzzySharp/SimilarityRatio/Strategy/Generic/PartialRatioStrategyT.cs +++ b/FuzzySharp/SimilarityRatio/Strategy/Generic/PartialRatioStrategyT.cs @@ -7,6 +7,8 @@ namespace FuzzySharp.SimilarityRatio.Strategy.Generic { internal class PartialRatioStrategy where T : IEquatable { + public static readonly Func CacheCalculate = Calculate; + public static int Calculate(T[] input1, T[] input2) { T[] shorter; diff --git a/FuzzySharp/SimilarityRatio/Strategy/PartialRatioStrategy.cs b/FuzzySharp/SimilarityRatio/Strategy/PartialRatioStrategy.cs index 1d25991..81351d6 100644 --- a/FuzzySharp/SimilarityRatio/Strategy/PartialRatioStrategy.cs +++ b/FuzzySharp/SimilarityRatio/Strategy/PartialRatioStrategy.cs @@ -7,6 +7,8 @@ namespace FuzzySharp.SimilarityRatio.Strategy { internal class PartialRatioStrategy { + public static readonly Func CacheCalculate = Calculate; + public static int Calculate(string input1, string input2) { string shorter;