Beispiel #1
0
        public static Tuple <TimeSpan, TimeSpan> CalculateTimings(Func <IEnumerable <Item>,
                                                                        IOrderedEnumerable <Item> > calculation, IEnumerable <Item> arg, IStopWatchProvider stopWatchProvider)
        {
            var stopWatch = stopWatchProvider.StartNew();
            var output    = calculation.Invoke(arg);

            MakeSafe(output.ToArray(), out var withoutCalcMs, stopWatchProvider);
            var totalMs = stopWatch.Elapsed;

            return(new Tuple <TimeSpan, TimeSpan>(totalMs, withoutCalcMs));
        }
Beispiel #2
0
        public static Item[] MakeSafe(Item[] items, out TimeSpan elapsedMs, IStopWatchProvider stopWatchProvider)
        {
            var watch = stopWatchProvider.StartNew();

            if (CheckIsSafe(items))
            {
                watch.Stop();
                elapsedMs = watch.Elapsed;
                return(items);
            }

            var factorial = items.Length.Factorial();
            var noOfTries = 0;
            var sorted    = false;

            while (!sorted)
            {
                for (var i = 0; i < items.Length; i++)
                {
                    if (!CheckIsSafeIndexed(items, i))
                    {
                        var temp = items[i - 1];
                        items[i - 1] = items[i];
                        items[i]     = temp;
                    }
                }

                if (CheckIsSafe(items))
                {
                    sorted = true;
                }

                if (noOfTries == factorial)
                {
                    throw new OverflowException();
                }

                noOfTries++;
            }

            watch.Stop();
            elapsedMs = watch.Elapsed;
            return(items);
        }