public void TestPerformanceBatchSize(Tuple<int, int, int, int> testCase) { var total = (long) testCase.Item1*(testCase.Item1 + 1)/2*testCase.Item2; using (var journal = new Journal(TestDirectory, batchSize: testCase.Item4)) { var addingElapsedByThreadId = new ConcurrentDictionary<long, List<TimeSpan>>(); Parallel.For(1, testCase.Item1 + 1, new ParallelOptions { MaxDegreeOfParallelism = testCase.Item3 }, value => { var addingElapsed = StopWatchUtil.Measure(() => { var tasks = Enumerable.Range(1, testCase.Item2) .Select(_ => { return journal.AddAsync(new Transaction(Operation.Deposit, value)); }) .ToArray(); Task.WaitAll(tasks); }); addingElapsedByThreadId.AddOrUpdate( Thread.CurrentThread.ManagedThreadId, key => { return new List<TimeSpan> {addingElapsed}; }, (key, list) => { list.Add(addingElapsed); return list; }); }); var computingElapsed = StopWatchUtil.Measure(() => { Assert.AreEqual(total, TransactionsHelper.ComputeTotal(journal)); }); using ( var fileStream = new FileStream( Path.Combine(TestContext.CurrentContext.TestDirectory, GetType().FullName + ".txt"), FileMode.Append)) { using (var streamWriter = new StreamWriter(fileStream)) { streamWriter.WriteLine("***" + testCase + "***"); streamWriter.WriteLine("timestamp=" + DateTimeOffset.UtcNow); streamWriter.WriteLine("threads=" + addingElapsedByThreadId.Keys.Count); streamWriter.WriteLine("addingMS=" + addingElapsedByThreadId.Values.Sum( v => v.Sum(timeSpan => timeSpan.TotalMilliseconds))); streamWriter.WriteLine("computingMS=" + computingElapsed.TotalMilliseconds); journal.DumpStatistic(streamWriter.WriteLine); } } } }