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)); }
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); }