static void Main(string[] args) { long tot0 = 0, tot1 = 0; var watch = new Stopwatch(); for (int reps1 = 0; reps1 < 5; ++reps1) { // Benchmark the .NET provided binary searcher. watch.Reset(); watch.Start(); for (int rx = 0; rx < reps; ++rx) { for (var ix = 0; ix < Map1252.Length; ++ix) { var pos = Map1252.ArrayBinarySearch(Map1252.At(ix) & 0x7FFFFF00); var fit = Map1252.At(~pos) & 0xFF; Debug.Assert(ix == ~pos); } } tot0 += watch.ElapsedMilliseconds; // Benchmark the custom binary searcher. watch.Reset(); watch.Start(); for (int rx = 0; rx < reps; ++rx) { for (var ix = 0; ix < Map1252.Length; ++ix) { var result = Map1252.To1252Bestfit(Map1252.At(ix) >> 8); Debug.Assert(result == (Map1252.At(ix) & 0xFF)); } } tot1 += watch.ElapsedMilliseconds; } Console.WriteLine("Custom binary search change over Array.BinarySearch = " + 100f * (tot0 - tot1) / tot0 + "%"); /* Output: * * Custom binary search change over Array.BinarySearch = 32.51122% * */ }
public void Test_Map1252Search() { for (var ix = 0; ix < Map1252.Length; ++ix) { var expectedResult = Map1252.At(ix) & 0xFF; var result = Map1252.To1252Bestfit(Map1252.At(ix) >> 8); Assert.IsTrue(expectedResult > 0); Assert.IsTrue(result == expectedResult); } var minvalResult = Map1252.To1252Bestfit(0); var maxvalResult = Map1252.To1252Bestfit(0x10FFFF); Assert.IsTrue(minvalResult == 0); // U+10FFFF not expected and not actually against the spec. Assert.IsTrue(maxvalResult < 0); }