diff --git a/PersistentMap/KeyStrategies/StandardStrategy.cs b/PersistentMap/KeyStrategies/StandardStrategy.cs index 77f6701..94cc05c 100644 --- a/PersistentMap/KeyStrategies/StandardStrategy.cs +++ b/PersistentMap/KeyStrategies/StandardStrategy.cs @@ -35,3 +35,19 @@ public readonly struct StandardStrategy : IKeyStrategy return _comparer.Compare(x, y); } } +public readonly struct StandardStrategy2 : IKeyStrategy + where TComparer : struct, IComparer + { + private readonly TComparer _comparer; + + public StandardStrategy2(TComparer comparer) => _comparer = comparer; + + public bool UsesPrefixes => false; + public bool UseBinarySearch => true; + +[MethodImpl(MethodImplOptions.AggressiveInlining)] +public int Compare(K x, K y) => _comparer.Compare(x, y); + + public long GetPrefix(K key) => 0; + } + diff --git a/benchmarks/MyBenchMarks/StringBenchmarks.cs b/benchmarks/MyBenchMarks/StringBenchmarks.cs index 302e5d1..6f1dc30 100644 --- a/benchmarks/MyBenchMarks/StringBenchmarks.cs +++ b/benchmarks/MyBenchMarks/StringBenchmarks.cs @@ -5,9 +5,15 @@ using System.Linq; using BenchmarkDotNet.Attributes; using LanguageExt; using PersistentMap; - +using System.Runtime.CompilerServices; namespace MapBenchmarks; +public readonly struct OrdinalComparer : IComparer +{ + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public int Compare(string? x, string? y) => string.CompareOrdinal(x, y); +} + [MemoryDiagnoser] public class StringMapBenchmarks { @@ -28,10 +34,10 @@ public class StringMapBenchmarks private LanguageExt.Map _extMap; private LanguageExt.HashMap _extHashMap; - private PersistentMap> _persistentMapStandard; + private PersistentMap> _persistentMapStandard; private PersistentMap _persistentMapUnicode; - private readonly StandardStrategy _stdStrategy = new StandardStrategy(); + private readonly StandardStrategy2 _stdStrategy = new StandardStrategy2(new OrdinalComparer()); private readonly UnicodeStrategy _uniStrategy = new UnicodeStrategy(); [GlobalSetup] @@ -71,7 +77,7 @@ public class StringMapBenchmarks _extHashMap = _extHashMap.AddOrUpdate(_allKeys[i], i); } - var transStd = BaseOrderedMap>.CreateTransient(_stdStrategy); + var transStd = BaseOrderedMap>.CreateTransient(_stdStrategy); var transUni = BaseOrderedMap.CreateTransient(_uniStrategy); for (int i = 0; i < _allKeys.Length; i++) { @@ -91,9 +97,9 @@ public class StringMapBenchmarks // --- 1. BUILD --- [Benchmark] - public PersistentMap> Build_TransientMap_Standard() + public PersistentMap> Build_TransientMap_Standard() { - var map = BaseOrderedMap>.CreateTransient(_stdStrategy); + var map = BaseOrderedMap>.CreateTransient(_stdStrategy); for (int i = 0; i < _allKeys.Length; i++) map.Set(_allKeys[i], i); return map.ToPersistent(); } @@ -207,7 +213,7 @@ public class StringMapBenchmarks } [Benchmark] - public PersistentMap> Update_PersistentMap_Standard() + public PersistentMap> Update_PersistentMap_Standard() { var map = _persistentMapStandard; foreach (var k in _updateKeys) map = map.Set(k, 999); @@ -222,7 +228,7 @@ public class StringMapBenchmarks } [Benchmark] - public PersistentMap> Update_TransientMap_Standard() + public PersistentMap> Update_TransientMap_Standard() { var transient = _persistentMapStandard.ToTransient(); foreach (var k in _updateKeys) transient.Set(k, 999); @@ -272,7 +278,7 @@ public class StringMapBenchmarks } [Benchmark] - public PersistentMap> UpdateSet_PersistentMap_Standard() + public PersistentMap> UpdateSet_PersistentMap_Standard() { var map = _persistentMapStandard; foreach (var k in _mixedKeys) map = map.Set(k, 999); @@ -288,7 +294,7 @@ public class StringMapBenchmarks } [Benchmark] - public PersistentMap> UpdateSet_TransientMap_Standard() + public PersistentMap> UpdateSet_TransientMap_Standard() { var transient = _persistentMapStandard.ToTransient(); foreach (var k in _mixedKeys) transient.Set(k, 999); @@ -388,7 +394,7 @@ public class StringMapBenchmarks } [Benchmark] - public PersistentMap> Remove_PersistentMap_Standard() + public PersistentMap> Remove_PersistentMap_Standard() { var map = _persistentMapStandard; foreach (var k in _removeKeys) map = map.Remove(k); @@ -404,7 +410,7 @@ public class StringMapBenchmarks } [Benchmark] - public PersistentMap> Remove_TransientMap_Standard() + public PersistentMap> Remove_TransientMap_Standard() { var transient = _persistentMapStandard.ToTransient(); foreach (var k in _removeKeys) transient.Remove(k);