示例#1
0
        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);
        }
示例#2
0
        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);
            }
        }
示例#3
0
        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);
                        }
                    }
        }
示例#4
0
        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);
            }
        }