diff --git a/DiscImageChef.Core/Benchmark.cs b/DiscImageChef.Core/Benchmark.cs index 94d15bb4..bbbe373f 100644 --- a/DiscImageChef.Core/Benchmark.cs +++ b/DiscImageChef.Core/Benchmark.cs @@ -37,26 +37,51 @@ // //$Id$ using System; +using System.Collections.Generic; using System.IO; using DiscImageChef.Checksums; using DiscImageChef.Console; namespace DiscImageChef.Core { + public struct BenchmarkResults + { + public double fillTime; + public double fillSpeed; + public double readTime; + public double readSpeed; + public double entropyTime; + public double entropySpeed; + public Dictionary entries; + public long minMemory; + public long maxMemory; + public double separateTime; + public double separateSpeed; + public double totalTime; + public double totalSpeed; + } + + public struct BenchmarkEntry + { + public double timeSpan; + public double speed; + } + public static class Benchmark { - public static void Do(int bufferSize, int blockSize) + public static BenchmarkResults Do(int bufferSize, int blockSize) { - long minMemory = long.MaxValue; - long maxMemory = 0; + BenchmarkResults results = new BenchmarkResults(); + results.entries = new Dictionary(); + results.minMemory = long.MaxValue; + results.maxMemory = 0; + results.separateTime = 0; MemoryStream ms = new MemoryStream(bufferSize); Random rnd = new Random(); DateTime start; DateTime end; long mem; object ctx; - double allSeparate = 0; - System.Collections.Generic.Dictionary checksumTimes = new System.Collections.Generic.Dictionary(); DicConsole.WriteLine(); @@ -71,14 +96,15 @@ namespace DiscImageChef.Core end = DateTime.Now; DicConsole.WriteLine(); - DicConsole.WriteLine("Took {0} seconds to fill buffer, {1} MiB/sec.", (end - start).TotalSeconds, (bufferSize / 1048576) / (end - start).TotalSeconds); + results.fillTime = (end - start).TotalSeconds; + results.fillSpeed = (bufferSize / 1048576) / (end - start).TotalSeconds; ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; start = DateTime.Now; for(int i = 0; i < bufferSize / blockSize; i++) { @@ -88,23 +114,24 @@ namespace DiscImageChef.Core } end = DateTime.Now; mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; DicConsole.WriteLine(); - DicConsole.WriteLine("Took {0} seconds to read buffer, {1} MiB/sec.", (end - start).TotalSeconds, (bufferSize / 1048576) / (end - start).TotalSeconds); + results.readTime = (end - start).TotalSeconds; + results.readSpeed = (bufferSize / 1048576) / (end - start).TotalSeconds; #region Adler32 ctx = new Adler32Context(); ((Adler32Context)ctx).Init(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; start = DateTime.Now; for(int i = 0; i < bufferSize / blockSize; i++) { @@ -116,15 +143,14 @@ namespace DiscImageChef.Core ((Adler32Context)ctx).End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; DicConsole.WriteLine(); - DicConsole.WriteLine("Took {0} seconds to Adler32 buffer, {1} MiB/sec.", (end - start).TotalSeconds, (bufferSize / 1048576) / (end - start).TotalSeconds); - allSeparate += (end - start).TotalSeconds; - checksumTimes.Add("Adler32", (end - start).TotalSeconds); + results.entries.Add("Adler32", new BenchmarkEntry() { timeSpan = (end - start).TotalSeconds, speed = (bufferSize / 1048576) / (end - start).TotalSeconds }); + results.separateTime += (end - start).TotalSeconds; #endregion Adler32 #region CRC16 @@ -132,10 +158,10 @@ namespace DiscImageChef.Core ((CRC16Context)ctx).Init(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; start = DateTime.Now; for(int i = 0; i < bufferSize / blockSize; i++) { @@ -147,15 +173,14 @@ namespace DiscImageChef.Core ((CRC16Context)ctx).End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; DicConsole.WriteLine(); - DicConsole.WriteLine("Took {0} seconds to CRC16 buffer, {1} MiB/sec.", (end - start).TotalSeconds, (bufferSize / 1048576) / (end - start).TotalSeconds); - allSeparate += (end - start).TotalSeconds; - checksumTimes.Add("CRC16", (end - start).TotalSeconds); + results.entries.Add("CRC16", new BenchmarkEntry() { timeSpan = (end - start).TotalSeconds, speed = (bufferSize / 1048576) / (end - start).TotalSeconds }); + results.separateTime += (end - start).TotalSeconds; #endregion CRC16 #region CRC32 @@ -163,10 +188,10 @@ namespace DiscImageChef.Core ((CRC32Context)ctx).Init(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; start = DateTime.Now; for(int i = 0; i < bufferSize / blockSize; i++) { @@ -178,15 +203,14 @@ namespace DiscImageChef.Core ((CRC32Context)ctx).End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; DicConsole.WriteLine(); - DicConsole.WriteLine("Took {0} seconds to CRC32 buffer, {1} MiB/sec.", (end - start).TotalSeconds, (bufferSize / 1048576) / (end - start).TotalSeconds); - allSeparate += (end - start).TotalSeconds; - checksumTimes.Add("CRC32", (end - start).TotalSeconds); + results.entries.Add("CRC32", new BenchmarkEntry() { timeSpan = (end - start).TotalSeconds, speed = (bufferSize / 1048576) / (end - start).TotalSeconds }); + results.separateTime += (end - start).TotalSeconds; #endregion CRC32 #region CRC64 @@ -194,10 +218,10 @@ namespace DiscImageChef.Core ((CRC64Context)ctx).Init(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; start = DateTime.Now; for(int i = 0; i < bufferSize / blockSize; i++) { @@ -209,15 +233,14 @@ namespace DiscImageChef.Core ((CRC64Context)ctx).End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; DicConsole.WriteLine(); - DicConsole.WriteLine("Took {0} seconds to CRC64 buffer, {1} MiB/sec.", (end - start).TotalSeconds, (bufferSize / 1048576) / (end - start).TotalSeconds); - allSeparate += (end - start).TotalSeconds; - checksumTimes.Add("CRC64", (end - start).TotalSeconds); + results.entries.Add("CRC64", new BenchmarkEntry() { timeSpan = (end - start).TotalSeconds, speed = (bufferSize / 1048576) / (end - start).TotalSeconds }); + results.separateTime += (end - start).TotalSeconds; #endregion CRC64 #region MD5 @@ -225,10 +248,10 @@ namespace DiscImageChef.Core ((MD5Context)ctx).Init(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; start = DateTime.Now; for(int i = 0; i < bufferSize / blockSize; i++) { @@ -240,15 +263,14 @@ namespace DiscImageChef.Core ((MD5Context)ctx).End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; DicConsole.WriteLine(); - DicConsole.WriteLine("Took {0} seconds to MD5 buffer, {1} MiB/sec.", (end - start).TotalSeconds, (bufferSize / 1048576) / (end - start).TotalSeconds); - allSeparate += (end - start).TotalSeconds; - checksumTimes.Add("MD5", (end - start).TotalSeconds); + results.entries.Add("MD5", new BenchmarkEntry() { timeSpan = (end - start).TotalSeconds, speed = (bufferSize / 1048576) / (end - start).TotalSeconds }); + results.separateTime += (end - start).TotalSeconds; #endregion MD5 #region RIPEMD160 @@ -256,10 +278,10 @@ namespace DiscImageChef.Core ((RIPEMD160Context)ctx).Init(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; start = DateTime.Now; for(int i = 0; i < bufferSize / blockSize; i++) { @@ -271,15 +293,14 @@ namespace DiscImageChef.Core ((RIPEMD160Context)ctx).End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; DicConsole.WriteLine(); - DicConsole.WriteLine("Took {0} seconds to RIPEMD160 buffer, {1} MiB/sec.", (end - start).TotalSeconds, (bufferSize / 1048576) / (end - start).TotalSeconds); - allSeparate += (end - start).TotalSeconds; - checksumTimes.Add("RIPEMD160", (end - start).TotalSeconds); + results.entries.Add("RIPEMD160", new BenchmarkEntry() { timeSpan = (end - start).TotalSeconds, speed = (bufferSize / 1048576) / (end - start).TotalSeconds }); + results.separateTime += (end - start).TotalSeconds; #endregion RIPEMD160 #region SHA1 @@ -287,10 +308,10 @@ namespace DiscImageChef.Core ((SHA1Context)ctx).Init(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; start = DateTime.Now; for(int i = 0; i < bufferSize / blockSize; i++) { @@ -302,15 +323,14 @@ namespace DiscImageChef.Core ((SHA1Context)ctx).End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; DicConsole.WriteLine(); - DicConsole.WriteLine("Took {0} seconds to SHA1 buffer, {1} MiB/sec.", (end - start).TotalSeconds, (bufferSize / 1048576) / (end - start).TotalSeconds); - allSeparate += (end - start).TotalSeconds; - checksumTimes.Add("SHA1", (end - start).TotalSeconds); + results.entries.Add("SHA1", new BenchmarkEntry() { timeSpan = (end - start).TotalSeconds, speed = (bufferSize / 1048576) / (end - start).TotalSeconds }); + results.separateTime += (end - start).TotalSeconds; #endregion SHA1 #region SHA256 @@ -318,10 +338,10 @@ namespace DiscImageChef.Core ((SHA256Context)ctx).Init(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; start = DateTime.Now; for(int i = 0; i < bufferSize / blockSize; i++) { @@ -333,15 +353,14 @@ namespace DiscImageChef.Core ((SHA256Context)ctx).End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; DicConsole.WriteLine(); - DicConsole.WriteLine("Took {0} seconds to SHA256 buffer, {1} MiB/sec.", (end - start).TotalSeconds, (bufferSize / 1048576) / (end - start).TotalSeconds); - allSeparate += (end - start).TotalSeconds; - checksumTimes.Add("SHA256", (end - start).TotalSeconds); + results.entries.Add("SHA256", new BenchmarkEntry() { timeSpan = (end - start).TotalSeconds, speed = (bufferSize / 1048576) / (end - start).TotalSeconds }); + results.separateTime += (end - start).TotalSeconds; #endregion SHA256 #region SHA384 @@ -349,10 +368,10 @@ namespace DiscImageChef.Core ((SHA384Context)ctx).Init(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; start = DateTime.Now; for(int i = 0; i < bufferSize / blockSize; i++) { @@ -364,15 +383,14 @@ namespace DiscImageChef.Core ((SHA384Context)ctx).End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; DicConsole.WriteLine(); - DicConsole.WriteLine("Took {0} seconds to SHA384 buffer, {1} MiB/sec.", (end - start).TotalSeconds, (bufferSize / 1048576) / (end - start).TotalSeconds); - allSeparate += (end - start).TotalSeconds; - checksumTimes.Add("SHA384", (end - start).TotalSeconds); + results.entries.Add("SHA384", new BenchmarkEntry() { timeSpan = (end - start).TotalSeconds, speed = (bufferSize / 1048576) / (end - start).TotalSeconds }); + results.separateTime += (end - start).TotalSeconds; #endregion SHA384 #region SHA512 @@ -380,10 +398,10 @@ namespace DiscImageChef.Core ((SHA512Context)ctx).Init(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; start = DateTime.Now; for(int i = 0; i < bufferSize / blockSize; i++) { @@ -395,15 +413,14 @@ namespace DiscImageChef.Core ((SHA512Context)ctx).End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; DicConsole.WriteLine(); - DicConsole.WriteLine("Took {0} seconds to SHA512 buffer, {1} MiB/sec.", (end - start).TotalSeconds, (bufferSize / 1048576) / (end - start).TotalSeconds); - allSeparate += (end - start).TotalSeconds; - checksumTimes.Add("SHA512", (end - start).TotalSeconds); + results.entries.Add("SHA512", new BenchmarkEntry() { timeSpan = (end - start).TotalSeconds, speed = (bufferSize / 1048576) / (end - start).TotalSeconds }); + results.separateTime += (end - start).TotalSeconds; #endregion SHA512 #region SpamSum @@ -411,10 +428,10 @@ namespace DiscImageChef.Core ((SpamSumContext)ctx).Init(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; start = DateTime.Now; for(int i = 0; i < bufferSize / blockSize; i++) { @@ -426,25 +443,24 @@ namespace DiscImageChef.Core ((SpamSumContext)ctx).End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; DicConsole.WriteLine(); - DicConsole.WriteLine("Took {0} seconds to SpamSum buffer, {1} MiB/sec.", (end - start).TotalSeconds, (bufferSize / 1048576) / (end - start).TotalSeconds); - allSeparate += (end - start).TotalSeconds; - checksumTimes.Add("SpamSum", (end - start).TotalSeconds); + results.entries.Add("SpamSum", new BenchmarkEntry() { timeSpan = (end - start).TotalSeconds, speed = (bufferSize / 1048576) / (end - start).TotalSeconds }); + results.separateTime += (end - start).TotalSeconds; #endregion SpamSum #region Entropy ulong[] entTable = new ulong[256]; ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; start = DateTime.Now; for(int i = 0; i < bufferSize / blockSize; i++) { @@ -464,19 +480,19 @@ namespace DiscImageChef.Core } end = DateTime.Now; mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; DicConsole.WriteLine(); - DicConsole.WriteLine("Took {0} seconds to entropy buffer, {1} MiB/sec.", (end - start).TotalSeconds, (bufferSize / 1048576) / (end - start).TotalSeconds); - double entropyTime = (end - start).TotalSeconds; + results.entropyTime = (end - start).TotalSeconds; + results.entropySpeed = (bufferSize / 1048576) / (end - start).TotalSeconds; #endregion Entropy #region Multitasking start = DateTime.Now; - Core.Checksum allChecksums = new Core.Checksum(); + Checksum allChecksums = new Checksum(); for(int i = 0; i < bufferSize / blockSize; i++) { @@ -486,28 +502,23 @@ namespace DiscImageChef.Core allChecksums.Update(tmp); } + DicConsole.WriteLine(); allChecksums.End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); - if(mem > maxMemory) - maxMemory = mem; - if(mem < minMemory) - minMemory = mem; - - DicConsole.WriteLine(); - DicConsole.WriteLine("Took {0} seconds to do all algorithms at the same time, {1} MiB/sec.", (end - start).TotalSeconds, (bufferSize / 1048576) / (end - start).TotalSeconds); + if(mem > results.maxMemory) + results.maxMemory = mem; + if(mem < results.minMemory) + results.minMemory = mem; + results.totalTime = (end - start).TotalSeconds; + results.totalSpeed = (bufferSize / 1048576) / results.totalTime; #endregion - DicConsole.WriteLine("Took {0} seconds to do all algorithms sequentially, {1} MiB/sec.", allSeparate, (bufferSize / 1048576) / allSeparate); + results.separateSpeed = (bufferSize / 1048576) / results.separateTime; - DicConsole.WriteLine(); - DicConsole.WriteLine("Max memory used is {0} bytes", maxMemory); - DicConsole.WriteLine("Min memory used is {0} bytes", minMemory); - - Core.Statistics.AddCommand("benchmark"); - Core.Statistics.AddBenchmark(checksumTimes, entropyTime, (end - start).TotalSeconds, allSeparate, maxMemory, minMemory); + return results; } } } diff --git a/DiscImageChef.Core/ChangeLog b/DiscImageChef.Core/ChangeLog index 3e3592d5..47b61ff5 100644 --- a/DiscImageChef.Core/ChangeLog +++ b/DiscImageChef.Core/ChangeLog @@ -1,3 +1,8 @@ +2017-05-27 Natalia Portillo + + * Benchmark.cs: Refactor: Return result from core to CLI, show + in CLI. + 2017-05-27 Natalia Portillo * Benchmark.cs: diff --git a/DiscImageChef/ChangeLog b/DiscImageChef/ChangeLog index 85a74741..618d04bb 100644 --- a/DiscImageChef/ChangeLog +++ b/DiscImageChef/ChangeLog @@ -1,3 +1,8 @@ +2017-05-27 Natalia Portillo + + * Commands/Benchmark.cs: + Refactor: Return result from core to CLI, show in CLI. + 2017-05-27 Natalia Portillo * Commands/Benchmark.cs: diff --git a/DiscImageChef/Commands/Benchmark.cs b/DiscImageChef/Commands/Benchmark.cs index cff9be57..6229f3d7 100644 --- a/DiscImageChef/Commands/Benchmark.cs +++ b/DiscImageChef/Commands/Benchmark.cs @@ -30,8 +30,9 @@ // Copyright © 2011-2017 Natalia Portillo // ****************************************************************************/ - -using System.Threading; +using DiscImageChef.Core; +using System.Collections.Generic; +using DiscImageChef.Console; namespace DiscImageChef.Commands { @@ -39,7 +40,29 @@ namespace DiscImageChef.Commands { public static void doBenchmark(BenchmarkOptions options) { - Core.Benchmark.Do(options.BufferSize * 1024 * 1024, options.BlockSize); + Dictionary checksumTimes = new Dictionary(); + + BenchmarkResults results = Core.Benchmark.Do(options.BufferSize * 1024 * 1024, options.BlockSize); + + DicConsole.WriteLine("Took {0} seconds to fill buffer, {1:F3} MiB/sec.", results.fillTime, results.fillSpeed); + DicConsole.WriteLine("Took {0} seconds to read buffer, {1:F3} MiB/sec.", results.readTime, results.readSpeed); + DicConsole.WriteLine("Took {0} seconds to entropy buffer, {1:F3} MiB/sec.", results.entropyTime, results.entropySpeed); + + foreach(KeyValuePair entry in results.entries) + { + checksumTimes.Add(entry.Key, entry.Value.timeSpan); + DicConsole.WriteLine("Took {0} seconds to {1} buffer, {2:F3} MiB/sec.", entry.Value.timeSpan, entry.Key, entry.Value.speed); + } + + DicConsole.WriteLine("Took {0} seconds to do all algorithms at the same time, {1} MiB/sec.", results.totalTime, results.totalSpeed); + DicConsole.WriteLine("Took {0} seconds to do all algorithms sequentially, {1} MiB/sec.", results.separateTime, results.separateSpeed); + + DicConsole.WriteLine(); + DicConsole.WriteLine("Max memory used is {0} bytes", results.maxMemory); + DicConsole.WriteLine("Min memory used is {0} bytes", results.minMemory); + + Core.Statistics.AddCommand("benchmark"); + Core.Statistics.AddBenchmark(checksumTimes, results.entropyTime, results.totalTime, results.separateTime, results.maxMemory, results.minMemory); } } }