public void HandRankCalculator_SpeedTest1()
        {
            //arrange
            var deck = new Deck();
            var handRankSpeedResults = new HandRankCalculatorSpeedTestsDataObject();

            //act
            const int numIterations = 500000;

            for (var i = 0; i < numIterations; i++)
            {
                var randomCards = deck.GetRandomCards(5);
                var hand        = new Hand(randomCards);

                var stopwatch = Stopwatch.StartNew();
                var handRank  = _instance.CalculateHandRank(hand);
                handRankSpeedResults.PokerHandResults[handRank.PokerHand].AddCalculationData(stopwatch.ElapsedTicks);
            }

            Console.WriteLine("Total Times:");
            DisplaySpeedResults(handRankSpeedResults, x => x.TotalCalculationTicks);

            Console.WriteLine();
            Console.WriteLine();

            Console.WriteLine("Average Times:");
            DisplaySpeedResults(handRankSpeedResults, x => x.AverageCalculationTicks);
        }
        private void DisplaySpeedResults(HandRankCalculatorSpeedTestsDataObject currentSpeedResults, Func <HandRankCalculatorSpeedTestVersionResult, double> propertyAccessorFunc)
        {
            var pokerHandNames = Utilities.GetEnumValues <PokerHand>();
            var columnHeaders  = string.Join("|", pokerHandNames.Select(x => x.ToString().CenterString(13)));

            Console.WriteLine($"{"Version".CenterString(29)}|{columnHeaders}");
            Console.WriteLine($"-----------------------------{string.Join("", Enumerable.Range(0, 10).Select(x => "|-------------"))}");

            DisplaySpeedResult("Current", currentSpeedResults, propertyAccessorFunc);

            var assembly = GetType().Assembly;
            var stream   = assembly.GetManifestResourceStream($"{assembly.GetName().Name}.HandRankCalculator.TestData.timing-data.json");

            using var streamReader = new StreamReader(stream);
            var timingDataObjects = JsonSerializer.Deserialize <List <HandRankCalculatorSpeedTestsDataObject> >(streamReader.ReadToEnd());

            foreach (var x in timingDataObjects.OrderByDescending(x => x.VersionOrdinal))
            {
                DisplaySpeedResult(x.VersionName, x, propertyAccessorFunc);
            }
        }
        private void DisplaySpeedResult(string versionName, HandRankCalculatorSpeedTestsDataObject speedResults, Func <HandRankCalculatorSpeedTestVersionResult, double> propertyAccessorFunc)
        {
            var pokerHandTicks = speedResults.PokerHandResults.Select(x => Utilities.GetTicksAsStringWithUnit(propertyAccessorFunc(x.Value)).CenterString(13)).ToList();

            Console.WriteLine($"{versionName.CenterString(29)}|{string.Join("|", pokerHandTicks)}");
        }