コード例 #1
0
        /// <summary>
        /// Runs this instance.
        /// </summary>
        public void Run()
        {
            string ppcArg = Program.Args.Where(a => a.StartsWith(PpcArgMarker)).SingleOrDefault();

            if (ppcArg != null)
            {
                ppcArg    = ppcArg.Remove(0, PpcArgMarker.Length);
                passCount = int.Parse(ppcArg);
            }
            var    toolNames = Program.ToolNames;
            string ptArg     = Program.Args.Where(a => a.StartsWith(PtArgMarker)).SingleOrDefault();

            if (ptArg != null)
            {
                ptArg     = ptArg.Remove(0, PtArgMarker.Length);
                toolNames = ptArg.RevertibleSplit('/', ',').Distinct().ToList();
            }

            foreach (int itemCount in ItemCounts)
            {
                var scorecard = new Scorecard();
                scorecard.RegisterTest("CRUD Performance:");
                scorecard.RegisterTest(Indent + PerformanceTestBase.Fetch);
                scorecard.RegisterTest(Indent + "Single Operation:");
                scorecard.RegisterTest(Indent2 + PerformanceTestBase.CreateSingle);
                scorecard.RegisterTest(Indent2 + PerformanceTestBase.UpdateSingle);
                scorecard.RegisterTest(Indent2 + PerformanceTestBase.RemoveSingle);
                scorecard.RegisterTest(Indent2 + PerformanceTestBase.CudAverageSingle);
                scorecard.RegisterTest(Indent + "Multiple Operations:");
                scorecard.RegisterTest(Indent2 + PerformanceTestBase.CreateMultiple);
                scorecard.RegisterTest(Indent2 + PerformanceTestBase.UpdateMultiple);
                scorecard.RegisterTest(Indent2 + PerformanceTestBase.RemoveMultiple);
                scorecard.RegisterTest(Indent2 + PerformanceTestBase.CudAverageMultiple);
                scorecard.RegisterTest("Data Access Performance:");
                scorecard.RegisterTest(Indent + "Query:");
                scorecard.RegisterTest(Indent2 + PerformanceTestBase.LinqQuery);
                scorecard.RegisterTest(Indent2 + PerformanceTestBase.CompiledLinqQuery);
                scorecard.RegisterTest(Indent2 + PerformanceTestBase.NativeQuery);
                scorecard.RegisterTest(Indent + "Paging (LINQ only):");
                scorecard.RegisterTest(Indent2 + PerformanceTestBase.LinqQuerySmallPage);
                scorecard.RegisterTest(Indent2 + PerformanceTestBase.LinqQueryAveragePage);
                scorecard.RegisterTest(Indent2 + PerformanceTestBase.LinqQueryLargePage);
                scorecard.RegisterTest(Indent2 + PerformanceTestBase.LinqQueryHugePage);
                scorecard.RegisterTest(Indent + "Materialization:");
                scorecard.RegisterTest(Indent2 + PerformanceTestBase.LinqMaterialize);
                scorecard.RegisterTest(Indent2 + PerformanceTestBase.NativeMaterialize);

                var tests = new List <PerformanceTestBase> {
                    new BLToolkitTest(),
                    new Linq2DbTest(),
                    new EF6Test(),
                    new EFCoreTest(),
                    new DapperTest(),
                    // new EntitySpacesTest(),
                    // new DOTest(),
                    // new LightSpeedTest(),
                    new LinqConnectTest(),
                    new Linq2SqlTest(),
                    new NHibernateTest(),
                    //new OpenAccessTest(),
                    new SubsonicTest(),
                    new SqlClientTest()
                };
                if (toolNames != null)
                {
                    tests = (
                        from test in tests
                        let shortToolName = test.ShortToolName.ToLower()
                                            let toolIndex = toolNames.IndexOf(shortToolName)
                                                            where toolIndex >= 0
                                                            orderby toolIndex
                                                            select test).ToList();
                }
                if (tests.Count == 0)
                {
                    return;
                }
                foreach (var test in tests)
                {
                    scorecard.Tools.Add(test.ShortToolName);
                }
                scorecard.Tools.Add(ToolTestBase.Unit);

                string sequenceName = string.Format("Performance tests ({0} items)", itemCount);
                Console.WriteLine("{0}:", sequenceName);

                for (var i = 0; i < passCount; i++)
                {
                    if (passCount > 1)
                    {
                        Console.WriteLine("Pass {0} out of {1}...", i + 1, passCount);
                    }
                    foreach (var test in tests)
                    {
                        try {
                            test.Scorecard = scorecard;
                            test.BaseCount = itemCount;
                            test.BaseSetup();
                            test.Execute();
                        }
                        catch (Exception e) {
                            Console.WriteLine("  Failed: {0}", e);
                            continue;
                        }
                        finally {
                            try {
                                test.BaseTearDown();
                            }
                            catch (Exception e) {
                                Console.WriteLine("  BaseTearDown failed: {0}", e);
                            }
                        }
                    }
                }

                Console.WriteLine();
                Console.WriteLine("{0} scorecard:", sequenceName);

                Console.Write(scorecard);
                JsonWriter.Write(scorecard.ToJson(sequenceName, tests.ToArray <ToolTestBase>()));

                Console.WriteLine();
                Console.WriteLine("Units:");
                Console.WriteLine("  op/s:      operations per second, more is better;");
                Console.WriteLine("  queries/s: queries per second, more is better;");
                Console.WriteLine("  pages/s:   pages per second, more is better;");
                Console.WriteLine("  objects/s: # of materialized objects per second, more is better.");
                Console.WriteLine();
                Console.WriteLine();
            }
        }