private async Task <List <BenchmarkTestContent> > PrepareTestData(BenchmarkOption benchmarkOption) { var list = new List <BenchmarkTestContent>(); if (!String.IsNullOrEmpty(benchmarkOption.Source)) { // explicit test file list.Add(new BenchmarkTestContent(benchmarkOption.Source, false, BenchmarkContent.UserDefined)); return(list); } // generate test data if ((benchmarkOption.Content & BenchmarkContent.Ascii) == BenchmarkContent.Ascii) { var testAsciiDataFolder = TestFileHelper.NewFolder(); await Task.WhenAll( Enumerable.Range(0, benchmarkOption.NumberOfFiles) .Select(i => TestFileHelper.NewFile(testAsciiDataFolder, benchmarkOption.FileSize, true))); list.Add(new BenchmarkTestContent(testAsciiDataFolder, true, BenchmarkContent.Ascii)); } if ((benchmarkOption.Content & BenchmarkContent.Binary) == BenchmarkContent.Binary) { var testBinaryDataFolder = TestFileHelper.NewFolder(); await Task.WhenAll( Enumerable.Range(0, benchmarkOption.NumberOfFiles) .Select(i => TestFileHelper.NewFile(testBinaryDataFolder, benchmarkOption.FileSize))); list.Add(new BenchmarkTestContent(testBinaryDataFolder, true, BenchmarkContent.Binary)); } return(list); }
public async Task <OperationSummary> RunBenchmark(BenchmarkOption benchmarkOption) { var operationSummaries = new List <OperationSummary>(); var keysFolder = TestFileHelper.NewFolder(); var iterations = await _iterationGenerator.PrepareIteration(benchmarkOption); var threads = benchmarkOption.Threads == 0 ? Environment.ProcessorCount : benchmarkOption.Threads; foreach (var iteration in iterations) { PasswordMode pm = iteration.Encryption ? PasswordMode.PublicKey : PasswordMode.None; var compressedFolder = TestFileHelper.NewFolder(benchmarkOption.OutputCompressed); var outputFolder = TestFileHelper.NewFolder(benchmarkOption.OutputDecompressed); // compress var compressOption = new CompressOption { Algo = iteration.Algo, CompressionRatio = iteration.CompressionRatio, BlockMode = BlockMode.Individual, SourceDirOrFile = iteration.Content.Source, DestinationDir = compressedFolder, Threads = threads, PasswordOption = await _benchmarkOptionHelper.GenerateCompressPasswordOption(pm, keysFolder) }; OperationSummary resultCompress = await _tarCompressCrypt.Compress(compressOption); if (_cancellationTokenSource.IsCancellationRequested) { await Cleanup(); return(null); } operationSummaries.Add(resultCompress); resultCompress.ThrowOnError(); // decompress var decompressOption = new DecompressOption { SourceDirOrFile = compressedFolder, DestinationDir = outputFolder, Threads = threads, PasswordOption = _benchmarkOptionHelper.GenerateDecompressPasswordOption(pm, keysFolder) }; OperationSummary resultDecompress = await _tarCompressCrypt.Decompress(decompressOption); if (_cancellationTokenSource.IsCancellationRequested) { await Cleanup(); return(null); } operationSummaries.Add(resultDecompress); resultDecompress.ThrowOnError(); StringBuilder sb = FormatResultSummary(iteration, resultCompress, resultDecompress); Console.Out.WriteLine(sb.ToString()); async Task Cleanup() { if (benchmarkOption.Cleanup) { await "del /f /s /q * > NUL".Run(compressedFolder, CancellationToken.None); Directory.Delete(compressedFolder, true); await "del /f /s /q * > NUL".Run(outputFolder, CancellationToken.None); Directory.Delete(outputFolder, true); } } await Cleanup(); } return(new OperationSummary(operationSummaries.SelectMany(i => i.OperationBlocks), 0, default)); }