private static void WriteSummaryRecord(BenchmarkRunSummary summary, SqlConnection conn) { var cmd = conn.CreateCommand(); cmd.CommandText = _insertCommand; cmd.Parameters.AddWithValue("@TestClassFullName", summary.TestClassFullName); cmd.Parameters.AddWithValue("@TestClass", summary.TestClass); cmd.Parameters.AddWithValue("@TestMethod", summary.TestMethod); cmd.Parameters.AddWithValue("@Variation", summary.Variation); cmd.Parameters.AddWithValue("@MachineName", summary.MachineName); cmd.Parameters.AddWithValue("@ProductReportingVersion", summary.ProductReportingVersion); cmd.Parameters.AddWithValue("@Framework", summary.Framework); cmd.Parameters.AddWithValue("@Architecture", summary.Architecture); cmd.Parameters.Add("@CustomData", SqlDbType.NVarChar).Value = (object)summary.CustomData ?? DBNull.Value; cmd.Parameters.AddWithValue("@RunStarted", summary.RunStarted); cmd.Parameters.AddWithValue("@WarmupIterations", summary.WarmupIterations); cmd.Parameters.AddWithValue("@Iterations", summary.Iterations); cmd.Parameters.AddWithValue("@TimeElapsedAverage", summary.TimeElapsedAverage); cmd.Parameters.AddWithValue("@TimeElapsedPercentile99", summary.TimeElapsedPercentile99); cmd.Parameters.AddWithValue("@TimeElapsedPercentile95", summary.TimeElapsedPercentile95); cmd.Parameters.AddWithValue("@TimeElapsedPercentile90", summary.TimeElapsedPercentile90); cmd.Parameters.AddWithValue("@TimeElapsedStandardDeviation", summary.TimeElapsedStandardDeviation); cmd.Parameters.AddWithValue("@MemoryDeltaAverage", summary.MemoryDeltaAverage); cmd.Parameters.AddWithValue("@MemoryDeltaPercentile99", summary.MemoryDeltaPercentile99); cmd.Parameters.AddWithValue("@MemoryDeltaPercentile95", summary.MemoryDeltaPercentile95); cmd.Parameters.AddWithValue("@MemoryDeltaPercentile90", summary.MemoryDeltaPercentile90); cmd.Parameters.AddWithValue("@MemoryDeltaStandardDeviation", summary.MemoryDeltaStandardDeviation); cmd.ExecuteNonQuery(); }
protected override async Task <RunSummary> RunTestAsync() { var runSummary = new BenchmarkRunSummary { TestClassFullName = TestCase.TestMethod.TestClass.Class.Name, TestClass = TestCase.TestMethod.TestClass.Class.Name.Split('.').Last(), TestMethod = TestCase.TestMethodName, Variation = TestCase.Variation, ProductReportingVersion = BenchmarkConfig.Instance.ProductReportingVersion, RunStarted = DateTime.UtcNow, MachineName = _machineName, Framework = PlatformServices.Default.Runtime.RuntimeType, Architecture = IntPtr.Size > 4 ? "x64" : "x86", WarmupIterations = TestCase.WarmupIterations, Iterations = TestCase.Iterations, CustomData = BenchmarkConfig.Instance.CustomData }; for (var i = 0; i < TestCase.WarmupIterations; i++) { var runner = CreateRunner(i + 1, TestCase.WarmupIterations, TestCase.Variation, warmup: true); runSummary.Aggregate(await runner.RunAsync()); } for (var i = 0; i < TestCase.Iterations; i++) { TestCase.MetricCollector.Reset(); var runner = CreateRunner(i + 1, TestCase.Iterations, TestCase.Variation, warmup: false); var iterationSummary = new BenchmarkIterationSummary(); iterationSummary.Aggregate(await runner.RunAsync(), TestCase.MetricCollector); runSummary.Aggregate(iterationSummary); } if (runSummary.Failed != 0 || runSummary.Skipped != 0) { _diagnosticMessageSink.OnMessage(new DiagnosticMessage($"No valid results for {TestCase.DisplayName}. {runSummary.Failed} of {TestCase.Iterations + TestCase.WarmupIterations} iterations failed.")); } else { runSummary.PopulateMetrics(); _diagnosticMessageSink.OnMessage(new DiagnosticMessage(runSummary.ToString())); foreach (var database in BenchmarkConfig.Instance.ResultDatabases) { try { new SqlServerBenchmarkResultProcessor(database).SaveSummary(runSummary); } catch (Exception ex) { _diagnosticMessageSink.OnMessage(new DiagnosticMessage($"Failed to save results to {database}{Environment.NewLine} {ex}")); throw; } } } return(runSummary); }
public void SaveSummary(BenchmarkRunSummary summary) { using (var conn = new SqlConnection(_connectionString)) { conn.Open(); EnsureRunsTableCreated(conn); WriteSummaryRecord(summary, conn); } }