public async Task ExecuteAsync(IApplicationCommandExecutionContext context) { var executionStart = DateTime.Now; var benchmarkDefinition = ContextOwner.SelectedBenchmarkDefinition; var benchmarkExecution = BenchmarkExecutionFactory.CreateBenchmarkExecution(benchmarkDefinition) as BenchmarkExecution; await context.ReportAsync(new FeedbackToApplication { Type = FeedbackType.ImportantMessage, Message = XmlSerializer.Serialize(benchmarkExecution) }); await context.ReportAsync(new FeedbackToApplication { Type = FeedbackType.LogInformation, Message = string.Format(Properties.Resources.CreatingThreads, benchmarkDefinition.NumberOfCallsInParallel) }); var initialTelemetryData = await TelemetryDataReader.ReadAsync(benchmarkDefinition); using (var client = HttpClientFactory.Create()) { var url = benchmarkDefinition.Url; if (!string.IsNullOrEmpty(url)) { client.BaseAddress = new Uri(url); } BenchmarkExecutionState firstBestExecutionState = null; switch (benchmarkDefinition.BenchmarkExecutionType) { case BenchmarkExecutionType.CsNative: { var clientCopy = client; var tasks = Enumerable.Range(1, benchmarkDefinition.NumberOfCallsInParallel).Select(t => ExecuteForThreadNativeCsAsync(context, benchmarkDefinition, benchmarkExecution, t, executionStart, clientCopy)); var executionStates = await Task.WhenAll(tasks); firstBestExecutionState = executionStates[0]; } break; case BenchmarkExecutionType.JavaScript: { firstBestExecutionState = await ExecuteForThreadJavaScriptAsync(context, benchmarkDefinition, benchmarkExecution, executionStart, client); } break; } var finalTelemetryData = await TelemetryDataReader.ReadAsync(benchmarkDefinition); if (firstBestExecutionState != null && finalTelemetryData.Count != 0) { firstBestExecutionState.RemoteRequiringForHowManySeconds = SecondsSpent(initialTelemetryData, finalTelemetryData, t => t.RequiringForHowManyMilliSeconds); firstBestExecutionState.RemoteExecutingForHowManySeconds = SecondsSpent(initialTelemetryData, finalTelemetryData, t => t.ExecutingForHowManyMilliSeconds); await context.ReportAsync(new FeedbackToApplication { Type = FeedbackType.ImportantMessage, Message = XmlSerializer.Serialize(firstBestExecutionState) }); } } await context.ReportAsync(new FeedbackToApplication { Type = FeedbackType.LogInformation, Message = Properties.Resources.AllThreadsFinished }); }
private async Task EndExecuteForThreadAsync(IApplicationCommandExecutionContext context, int threadNumber, DateTime executionStart, BenchmarkExecutionState benchmarkExecutionState) { benchmarkExecutionState.ExecutingForHowManySeconds = (int)Math.Floor((DateTime.Now - executionStart).TotalSeconds); benchmarkExecutionState.Finished = true; await context.ReportAsync(new FeedbackToApplication { Type = FeedbackType.ImportantMessage, Message = XmlSerializer.Serialize(benchmarkExecutionState) }); await context.ReportAsync(new FeedbackToApplication { Type = FeedbackType.LogInformation, Message = string.Format(Properties.Resources.FinishedThread, threadNumber) }); }
private async Task <BenchmarkExecutionState> JavaScriptFinishedAsync(int contentAsNumber, IApplicationCommandExecutionContext context, DateTime executionStart, BenchmarkExecutionState benchmarkExecutionState) { benchmarkExecutionState.Successes = contentAsNumber; await EndExecuteForThreadAsync(context, 1, executionStart, benchmarkExecutionState); return(benchmarkExecutionState); }