Beispiel #1
0
        public BenchResult BenchMark(IBench bench)
        {
            var warmuprounds = bench.WarmupRounds ?? WarmupRounds;
            var iterations   = bench.Iterations ?? Iterations;

            //Warmup
            if (warmuprounds > 0)
            {
                BenchWarmup(this, new BenchRunningEventArgs {
                    Title = bench.Title, Iterations = warmuprounds
                });
                bench.Execute(warmuprounds);
            }

            // Give the test as good a chance as possible of avoiding garbage collection
            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();

            BenchRunning(this, new BenchRunningEventArgs {
                Title = bench.Title, Iterations = iterations
            });
            var s = Stopwatch.StartNew();

            bench.Execute(iterations);
            var e = s.Elapsed;

            var result = new BenchResult
            {
                Elapsed    = e,
                Iterations = iterations
            };

            BenchComplete(this, new BenchCompleteEventArgs
            {
                Title  = bench.Title,
                Result = result
            });

            return(result);
        }
Beispiel #2
0
        static void Main()
        {
            var simplerng          = new SimpleUlidRng();
            var csrng              = new CSUlidRng();
            var simplemonotonicrng = new MonotonicUlidRng(simplerng);
            var csmonotonicrng     = new MonotonicUlidRng(csrng);
            var plainrng           = new Random();

            var pt = new SimpleBencher(10000000);

            //pt.BenchRunning += (s, e) => Console.WriteLine($"Running {e.Title}, {e.Iterations:N0} iterations...");
            //pt.BenchWarmup += (s, e) => Console.WriteLine($"Warmup {e.Title}, {e.Iterations:N0} iterations...");
            pt.BenchComplete += (s, e) => Console.WriteLine($"Completed {e.Title,-40}: {e.Result.OperationsPerSecond(),15:N0}/sec.");

            var d          = DateTimeOffset.Now;
            var benchtests = new IBench[] {
                new ForBench("Guid.NewGuid()", () => Guid.NewGuid()),
                new ForBench("Ulid.NewUlid(SimpleUlidRng)", () => Ulid.NewUlid(simplerng)),
                new ForBench("Ulid.NewUlid(CSUlidRng)", () => Ulid.NewUlid(csrng)),
                new ForBench("Ulid.NewUlid(SimpleMonotonicUlidRng)", () => Ulid.NewUlid(simplemonotonicrng)),
                new ForBench("Ulid.NewUlid(CSMonotonicUlidRng)", () => Ulid.NewUlid(csmonotonicrng)),
                new ForEachBench <string>("Guid.Parse(string)", (i) => Guid.Parse(i), (i) => Enumerable.Range(0, i).Select(n => Guid.NewGuid().ToString())),
                new ForEachBench <string>("Ulid.Parse(string)", (i) => Ulid.Parse(i), (i) => Enumerable.Range(0, i).Select(n => Ulid.NewUlid().ToString())),
                new ForEachBench <Guid>("Guid.ToString()", (i) => i.ToString(), (i) => Enumerable.Range(0, i).Select(n => Guid.NewGuid())),
                new ForEachBench <Ulid>("Ulid.ToString()", (i) => i.ToString(), (i) => Enumerable.Range(0, i).Select(n => Ulid.NewUlid())),
                new ForEachBench <byte[]>("new Guid(byte[])", (i) => new Guid(i), (i) => Enumerable.Range(0, i).Select(n => { var b = new byte[16]; plainrng.NextBytes(b); return(b); })),
                new ForEachBench <byte[]>("new Ulid(byte[])", (i) => new Ulid(i), (i) => Enumerable.Range(0, i).Select(n => { var b = new byte[16]; plainrng.NextBytes(b); return(b); })),
                new ForEachBench <Guid>("Guid.ToByteArray()", (i) => i.ToByteArray(), (i) => Enumerable.Range(0, i).Select(n => Guid.NewGuid())),
                new ForEachBench <Ulid>("Ulid.ToByteArray()", (i) => i.ToByteArray(), (i) => Enumerable.Range(0, i).Select(n => Ulid.NewUlid())),
                new ForEachBench <Ulid>("Ulid.ToGuid()", (i) => i.ToGuid(), (i) => Enumerable.Range(0, i).Select(n => Ulid.NewUlid())),
                new ForEachBench <Guid>("new Ulid(Guid)", (i) => new Ulid(i), (i) => Enumerable.Range(0, i).Select(n => Guid.NewGuid())),
            };

            var results = pt.BenchMark(benchtests).ToArray();

            Console.WriteLine("Done.");
        }
        public static void Main(string[] args)
        {
            var loopCount = "5";

            IBench bench = null;

            Thread runnerThread = null;

            BenchResult <Object> result = null;

            int executionCount = 5;

            List <BenchResult <Object> > results = new List <BenchResult <object> >();

            if (args?.Length >= 2)
            {
                loopCount = args[1];
                int benchType = int.Parse(args[0]);

                if (args?.Length >= 3)
                {
                    executionCount = int.Parse(args[2]);
                }

                switch (benchType)
                {
                case 1:
                    bench        = new SimpleFibonacciLoopBench();
                    runnerThread = new Thread(() => {
                        for (int i = 0; i < executionCount; i++)
                        {
                            result = bench.run(loopCount);
                            results.Add(result);
                        }
                    });
                    break;

                default:
                    bench        = new SimpleFibonacciBench();
                    runnerThread = new Thread(() => {
                        for (int i = 0; i < executionCount; i++)
                        {
                            result = bench.run(loopCount);
                            results.Add(result);
                        }
                    }, 1024 * 1024 * 1024);    //changes the thread stack size for the recursive
                    break;
                }
            }
            else
            {
                bench = new SimpleFibonacciLoopBench();

                runnerThread = new Thread(() => {
                    for (int i = 0; i < executionCount; i++)
                    {
                        result = bench.run(loopCount);
                        results.Add(result);
                    }
                });
            }

            runnerThread.Start();
            runnerThread.Join();

            var totalMs = results
                          .Sum(r => r.RunningMilliseconds);

            long averageMs = totalMs / executionCount;

            object rawResult = results[0].value;
            bool   resultsOk = results.All(r => rawResult.ToString().Equals(r.value.ToString()));

            if (!resultsOk)
            {
                Console.WriteLine("Execution problem, not all results are ok ='(");
                Environment.Exit(-1);
            }

            Console.Write($"{averageMs} {rawResult.ToString()}");
        }