public static LZ4Settings ParseSettings(string options) { var result = new LZ4Settings { Chaining = false }; foreach (var option in options.Split(' ')) { switch (option) { case "-1": result.Level = LZ4CompressionLevel.Level0; break; case "-9": result.Level = LZ4CompressionLevel.Level9; break; case "-11": result.Level = LZ4CompressionLevel.Level11; break; case "-12": result.Level = LZ4CompressionLevel.Level12; break; case "-BD": result.Chaining = true; break; case "-BX": // ignored to be implemented break; case "-B4": result.BlockSize = LZ4MemoryHelper.K64; break; case "-B5": result.BlockSize = LZ4MemoryHelper.K256; break; case "-B6": result.BlockSize = LZ4MemoryHelper.M1; break; case "-B7": result.BlockSize = LZ4MemoryHelper.M4; break; default: throw new NotImplementedException($"Option '{option}' not recognized"); } } return(result); }
private static void TestEncoder(string original, int chunkSize, LZ4Settings settings) { original = Tools.FindFile(original); var encoded = Path.GetTempFileName(); var decoded = Path.GetTempFileName(); try { TestedLZ4.Encode(original, encoded, chunkSize, settings); ReferenceLZ4.Decode(encoded, decoded); Tools.SameFiles(original, decoded); } finally { File.Delete(encoded); File.Delete(decoded); } }
public static void Encode(string original, string encoded, int chuckSize, LZ4Settings settings) { var frameInfo = new LZ4FrameDescriptor(null, false, settings.Chaining, false, null, settings.BlockSize); using (var input = File.OpenRead(original)) using (var output = File.Create(encoded)) using (var encode = new LZ4EncoderStream(output, frameInfo, i => LZ4EncodingFactory.CreateEncoder(i.Chaining, settings.Level, i.BlockSize, settings.ExtraBlocks))) { var buffer = new byte[chuckSize]; while (true) { var read = input.Read(buffer, 0, buffer.Length); if (read == 0) { break; } encode.Write(buffer, 0, read); } } }
private void TestEncoding(string original, int chunkSize, string options, string contentType = "??") { original = Tools.FindFile(original); var encoded = Path.GetTempFileName(); var decoded = Path.GetTempFileName(); LZ4Settings settings = Tools.ParseSettings(options); try { var stopwatch = Stopwatch.StartNew(); TestedLZ4.Encode(original, encoded, chunkSize, settings); stopwatch.Stop(); var testedEncodeTime = stopwatch.Elapsed; stopwatch.Restart(); TestedLZ4.Decode(encoded, decoded, chunkSize); stopwatch.Stop(); var testedDecodeTime = stopwatch.Elapsed; long testedEncodeSize = new FileInfo(encoded).Length; long testedOriginalSize = new FileInfo(original).Length; double testedCompress = (double)testedEncodeSize / (double)testedOriginalSize * 100; stopwatch.Restart(); ReferenceLZ4.Encode(options, original, encoded); stopwatch.Stop(); var refEncodeTime = stopwatch.Elapsed; stopwatch.Restart(); ReferenceLZ4.Decode(encoded, decoded); stopwatch.Stop(); var refDecodeTime = stopwatch.Elapsed; string encoderWinner = null; if (testedEncodeTime > refEncodeTime) { encoderWinner = string.Format("Native wins by {0}", (testedEncodeTime - refEncodeTime)); } else if (refEncodeTime > testedEncodeTime) { encoderWinner = string.Format("Implement wins by {0}", (refEncodeTime - testedEncodeTime)); } else { encoderWinner = "Tied!"; } string decoderWinner = null; if (testedDecodeTime > refDecodeTime) { decoderWinner = string.Format("Native wins by {0}", (testedDecodeTime - refDecodeTime)); } else if (refDecodeTime > testedDecodeTime) { decoderWinner = string.Format("Implement wins by {0}", (refDecodeTime - testedDecodeTime)); } else { decoderWinner = "Tied!"; } string settingsFormatted = string.Format("Level = {0}, BlockSize = {1}, Chaining = {2}", settings.Level, settings.BlockSize, settings.Chaining); string report = string.Format("Encoding payload '{0}' ({1}) implement vs native performance results: \n", original, contentType); report += string.Format("*** {0} ***\n", settingsFormatted); report += string.Format("- Encoder: {0} vs {1}\n", testedEncodeTime, refEncodeTime); report += " => " + encoderWinner + "\n"; report += string.Format("- Decoder: {0} vs {1}\n", testedDecodeTime, refDecodeTime); report += " => " + decoderWinner + "\n"; report += string.Format("- Reduced size from {0} to {1} => {2}% of original size\n", testedOriginalSize, testedEncodeSize, testedCompress); output.WriteLine("[TOUT/PERF] " + report); } finally { File.Delete(encoded); File.Delete(decoded); } }