Esempio n. 1
0
        private static string SelectCodec(
            string codec, string architecture,
            out TimedMethod compressor,
            out TimedMethod decompressor)
        {
            string codecCode;

            switch (codec.ToLower())
            {
            // compare implementation for LZ4 only

            case "mixedmode32":
                codecCode    = string.Format("MixedMode32@{0}", architecture);
                compressor   = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Encode32(b, 0, l));
                decompressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Decode32(b, 0, b.Length, l));
                break;

            case "mixedmode64":
                codecCode    = string.Format("MixedMode64@{0}", architecture);
                compressor   = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Encode64(b, 0, l));
                decompressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Decode64(b, 0, b.Length, l));
                break;

            case "cppcli32":
                codecCode    = string.Format("C++/CLI32@{0}", architecture);
                compressor   = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Encode32(b, 0, l));
                decompressor = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Decode32(b, 0, b.Length, l));
                break;

            case "cppcli64":
                codecCode    = string.Format("C++/CLI64@{0}", architecture);
                compressor   = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Encode64(b, 0, l));
                decompressor = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Decode64(b, 0, b.Length, l));
                break;

            case "unsafe64":
                codecCode    = string.Format("Unsafe64@{0}", architecture);
                compressor   = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Encode64(b, 0, l));
                decompressor = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Decode64(b, 0, b.Length, l));
                break;

            case "unsafe32":
                codecCode    = string.Format("Unsafe32@{0}", architecture);
                compressor   = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Encode32(b, 0, l));
                decompressor = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Decode32(b, 0, b.Length, l));
                break;

            case "safe64":
                codecCode    = string.Format("Safe64@{0}", architecture);
                compressor   = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Encode64(b, 0, l));
                decompressor = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Decode64(b, 0, b.Length, l));
                break;

            case "safe32":
                codecCode    = string.Format("Safe32@{0}", architecture);
                compressor   = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Encode32(b, 0, l));
                decompressor = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Decode32(b, 0, b.Length, l));
                break;

            // compare implementation for LZ4HC only

            case "mixedmode32hc":
                codecCode    = string.Format("MixedMode32HC@{0}", architecture);
                compressor   = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Encode32HC(b, 0, l));
                decompressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Decode32(b, 0, b.Length, l));
                break;

            case "mixedmode64hc":
                codecCode    = string.Format("MixedMode64HC@{0}", architecture);
                compressor   = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Encode64HC(b, 0, l));
                decompressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Decode64(b, 0, b.Length, l));
                break;

            case "cppcli32hc":
                codecCode    = string.Format("C++/CLI32HC@{0}", architecture);
                compressor   = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Encode32HC(b, 0, l));
                decompressor = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Decode32(b, 0, b.Length, l));
                break;

            case "cppcli64hc":
                codecCode    = string.Format("C++/CLI64HC@{0}", architecture);
                compressor   = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Encode64HC(b, 0, l));
                decompressor = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Decode64(b, 0, b.Length, l));
                break;

            case "unsafe64hc":
                codecCode    = string.Format("Unsafe64HC@{0}", architecture);
                compressor   = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Encode64HC(b, 0, l));
                decompressor = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Decode64(b, 0, b.Length, l));
                break;

            case "unsafe32hc":
                codecCode    = string.Format("Unsafe32HC@{0}", architecture);
                compressor   = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Encode32HC(b, 0, l));
                decompressor = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Decode32(b, 0, b.Length, l));
                break;

            case "safe64hc":
                codecCode    = string.Format("Safe64HC@{0}", architecture);
                compressor   = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Encode64HC(b, 0, l));
                decompressor = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Decode64(b, 0, b.Length, l));
                break;

            case "safe32hc":
                codecCode    = string.Format("Safe32HC@{0}", architecture);
                compressor   = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Encode32HC(b, 0, l));
                decompressor = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Decode32(b, 0, b.Length, l));
                break;

            // compare different algorithms (LZ4, LZO, Snappy, QuickLZ)

            case "lz4.native":
                codecCode = string.Format("LZ4.native@{0}", architecture);
                if (IntPtr.Size == 4)
                {
                    compressor   = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Encode32(b, 0, l));
                    decompressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Decode32(b, 0, b.Length, l));
                }
                else
                {
                    compressor   = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Encode64(b, 0, l));
                    decompressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Decode64(b, 0, b.Length, l));
                }
                break;

            case "lz4.unsafe":
                codecCode = string.Format("LZ4.unsafe@{0}", architecture);
                if (IntPtr.Size == 4)
                {
                    compressor   = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Encode32(b, 0, l));
                    decompressor = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Decode64(b, 0, b.Length, l));
                }
                else
                {
                    compressor   = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Encode64(b, 0, l));
                    decompressor = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Decode32(b, 0, b.Length, l));
                }
                break;

#if !X64
            // LZO is available only in 32-bit mode

            case "lzo1x.native":
                codecCode    = string.Format("LZO1X.native@{0}", architecture);
                compressor   = new TimedMethod(codecCode, NativeLZO1XCompressor);
                decompressor = new TimedMethod(codecCode, NativeLZODecompressor);
                break;

            case "lzo1x11.native":
                codecCode    = string.Format("LZO1X11.native@{0}", architecture);
                compressor   = new TimedMethod(codecCode, NativeLZO1X11Compressor);
                decompressor = new TimedMethod(codecCode, NativeLZODecompressor);
                break;

            case "lzo1x12.native":
                codecCode    = string.Format("LZO1X12.native@{0}", architecture);
                compressor   = new TimedMethod(codecCode, NativeLZO1X12Compressor);
                decompressor = new TimedMethod(codecCode, NativeLZODecompressor);
                break;

            case "lzo1x15.native":
                codecCode    = string.Format("LZO1X15.native@{0}", architecture);
                compressor   = new TimedMethod(codecCode, NativeLZO1X15Compressor);
                decompressor = new TimedMethod(codecCode, NativeLZODecompressor);
                break;

            case "lzo1x999.native":
                codecCode    = string.Format("LZO1X999.native@{0}", architecture);
                compressor   = new TimedMethod(codecCode, NativeLZO1X999Compressor);
                decompressor = new TimedMethod(codecCode, NativeLZODecompressor);
                break;
#endif

            case "lz4sharp.unsafe":
                codecCode = string.Format("LZ4Sharp.unsafe@{0}", architecture);
                if (IntPtr.Size == 4)
                {
                    var lz4sharp_compressor32   = new LZ4Sharp.LZ4Compressor32();
                    var lz4sharp_decompressor32 = new LZ4Sharp.LZ4Decompressor32();
                    compressor   = new TimedMethod(codecCode, (b, l) => lz4sharp_compressor32.Compress(b));
                    decompressor = new TimedMethod(codecCode, (b, l) =>
                    {
                        var output = new byte[l];
                        lz4sharp_decompressor32.DecompressKnownSize(b, output);
                        return(output);
                    });
                }
                else
                {
                    var lz4sharp_compressor64   = new LZ4Sharp.LZ4Compressor64();
                    var lz4sharp_decompressor64 = new LZ4Sharp.LZ4Decompressor64();
                    compressor   = new TimedMethod(codecCode, (b, l) => lz4sharp_compressor64.Compress(b));
                    decompressor = new TimedMethod(codecCode, (b, l) =>
                    {
                        var output = new byte[l];
                        lz4sharp_decompressor64.DecompressKnownSize(b, output);
                        return(output);
                    });
                }
                break;

            case "quicklz.native":
                codecCode    = string.Format("QuickLZ.native@{0}", architecture);
                compressor   = new TimedMethod(codecCode, NativeQuickLZCompressor);
                decompressor = new TimedMethod(codecCode, NativeQuickLZDecompressor);
                break;

            case "snappy.native":
                codecCode    = string.Format("Snappy.native@{0}", architecture);
                compressor   = new TimedMethod(codecCode, NativeSnappyCompressor);
                decompressor = new TimedMethod(codecCode, NativeSnappyDecompressor);
                break;

            // safe compressors

            case "lz4.safe":
                codecCode = string.Format("LZ4.safe@{0}", architecture);
                if (IntPtr.Size == 4)
                {
                    compressor   = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Encode32(b, 0, l));
                    decompressor = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Decode64(b, 0, b.Length, l));
                }
                else
                {
                    compressor   = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Encode32(b, 0, l));
                    decompressor = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Decode64(b, 0, b.Length, l));
                }
                break;

            case "lzf.safe":
                codecCode    = string.Format("LZF.safe@{0}", architecture);
                compressor   = new TimedMethod(codecCode, SafeLZFCompressor);
                decompressor = new TimedMethod(codecCode, SafeLZFDecompressor);
                break;

            case "quicklz1.safe":
                codecCode    = string.Format("QuickLZ1.safe@{0}", architecture);
                compressor   = new TimedMethod(codecCode, SafeQuickLZ1Compressor);
                decompressor = new TimedMethod(codecCode, SafeQuickLZDecompressor);
                break;

            case "quicklz3.safe":
                codecCode    = string.Format("QuickLZ3.safe@{0}", architecture);
                compressor   = new TimedMethod(codecCode, SafeQuickLZ3Compressor);
                decompressor = new TimedMethod(codecCode, SafeQuickLZDecompressor);
                break;

            case "deflate.safe":
                codecCode    = string.Format("Deflate.safe@{0}", architecture);
                compressor   = new TimedMethod(codecCode, DeflateCompressor);
                decompressor = new TimedMethod(codecCode, DeflateDecompressor);
                break;

            default:
                throw new ArgumentException(string.Format("Unknown codec: {0}", codec));
            }
            return(codecCode);
        }
Esempio n. 2
0
        private static string SelectCodec(
			string codec, string architecture, 
			out TimedMethod compressor, 
			out TimedMethod decompressor)
        {
            string codecCode;
            switch (codec.ToLower())
            {
                // compare implementation for LZ4 only

                case "mixedmode32":
                    codecCode = string.Format("MixedMode32@{0}", architecture);
                    compressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Encode32(b, 0, l));
                    decompressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Decode32(b, 0, b.Length, l));
                    break;
                case "mixedmode64":
                    codecCode = string.Format("MixedMode64@{0}", architecture);
                    compressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Encode64(b, 0, l));
                    decompressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Decode64(b, 0, b.Length, l));
                    break;
                case "cppcli32":
                    codecCode = string.Format("C++/CLI32@{0}", architecture);
                    compressor = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Encode32(b, 0, l));
                    decompressor = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Decode32(b, 0, b.Length, l));
                    break;
                case "cppcli64":
                    codecCode = string.Format("C++/CLI64@{0}", architecture);
                    compressor = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Encode64(b, 0, l));
                    decompressor = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Decode64(b, 0, b.Length, l));
                    break;
                case "unsafe64":
                    codecCode = string.Format("Unsafe64@{0}", architecture);
                    compressor = new TimedMethod(codecCode, (b, l) => LZ4n.LZ4Codec.Encode64(b, 0, l));
                    decompressor = new TimedMethod(codecCode, (b, l) => LZ4n.LZ4Codec.Decode64(b, 0, b.Length, l));
                    break;
                case "unsafe32":
                    codecCode = string.Format("Unsafe32@{0}", architecture);
                    compressor = new TimedMethod(codecCode, (b, l) => LZ4n.LZ4Codec.Encode32(b, 0, l));
                    decompressor = new TimedMethod(codecCode, (b, l) => LZ4n.LZ4Codec.Decode32(b, 0, b.Length, l));
                    break;
                case "safe64":
                    codecCode = string.Format("Safe64@{0}", architecture);
                    compressor = new TimedMethod(codecCode, (b, l) => LZ4s.LZ4Codec.Encode64(b, 0, l));
                    decompressor = new TimedMethod(codecCode, (b, l) => LZ4s.LZ4Codec.Decode64(b, 0, b.Length, l));
                    break;
                case "safe32":
                    codecCode = string.Format("Safe32@{0}", architecture);
                    compressor = new TimedMethod(codecCode, (b, l) => LZ4s.LZ4Codec.Encode32(b, 0, l));
                    decompressor = new TimedMethod(codecCode, (b, l) => LZ4s.LZ4Codec.Decode32(b, 0, b.Length, l));
                    break;

                // compare different algorithms (LZ4, LZO, Snappy, QuickLZ)

                case "lz4.native":
                    codecCode = string.Format("LZ4.native@{0}", architecture);
                    if (IntPtr.Size == 4)
                    {
                        compressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Encode32(b, 0, l));
                        decompressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Decode32(b, 0, b.Length, l));
                    }
                    else
                    {
                        compressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Encode64(b, 0, l));
                        decompressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Decode64(b, 0, b.Length, l));
                    }
                    break;

                case "lz4.unsafe":
                    codecCode = string.Format("LZ4.unsafe@{0}", architecture);
                    if (IntPtr.Size == 4)
                    {
                        compressor = new TimedMethod(codecCode, (b, l) => LZ4n.LZ4Codec.Encode32(b, 0, l));
                        decompressor = new TimedMethod(codecCode, (b, l) => LZ4n.LZ4Codec.Decode64(b, 0, b.Length, l));
                    }
                    else
                    {
                        compressor = new TimedMethod(codecCode, (b, l) => LZ4n.LZ4Codec.Encode64(b, 0, l));
                        decompressor = new TimedMethod(codecCode, (b, l) => LZ4n.LZ4Codec.Decode32(b, 0, b.Length, l));
                    }
                    break;

            #if !X64
                // LZO is available only in 32-bit mode

                case "lzo1x.native":
                    codecCode = string.Format("LZO1X.native@{0}", architecture);
                    compressor = new TimedMethod(codecCode, NativeLZO1XCompressor);
                    decompressor = new TimedMethod(codecCode, NativeLZODecompressor);
                    break;

                case "lzo1x11.native":
                    codecCode = string.Format("LZO1X11.native@{0}", architecture);
                    compressor = new TimedMethod(codecCode, NativeLZO1X11Compressor);
                    decompressor = new TimedMethod(codecCode, NativeLZODecompressor);
                    break;

                case "lzo1x12.native":
                    codecCode = string.Format("LZO1X12.native@{0}", architecture);
                    compressor = new TimedMethod(codecCode, NativeLZO1X12Compressor);
                    decompressor = new TimedMethod(codecCode, NativeLZODecompressor);
                    break;

                case "lzo1x15.native":
                    codecCode = string.Format("LZO1X15.native@{0}", architecture);
                    compressor = new TimedMethod(codecCode, NativeLZO1X15Compressor);
                    decompressor = new TimedMethod(codecCode, NativeLZODecompressor);
                    break;

                case "lzo1x999.native":
                    codecCode = string.Format("LZO1X999.native@{0}", architecture);
                    compressor = new TimedMethod(codecCode, NativeLZO1X999Compressor);
                    decompressor = new TimedMethod(codecCode, NativeLZODecompressor);
                    break;

            #endif

                case "lz4sharp.unsafe":
                    codecCode = string.Format("LZ4Sharp.unsafe@{0}", architecture);
                    if (IntPtr.Size == 4)
                    {
                        var lz4sharp_compressor32 = new LZ4Sharp.LZ4Compressor32();
                        var lz4sharp_decompressor32 = new LZ4Sharp.LZ4Decompressor32();
                        compressor = new TimedMethod(codecCode, (b, l) => lz4sharp_compressor32.Compress(b));
                        decompressor = new TimedMethod(codecCode, (b, l) =>
                            {
                                var output = new byte[l];
                                lz4sharp_decompressor32.DecompressKnownSize(b, output);
                                return output;
                            });
                    }
                    else
                    {
                        var lz4sharp_compressor64 = new LZ4Sharp.LZ4Compressor64();
                        var lz4sharp_decompressor64 = new LZ4Sharp.LZ4Decompressor64();
                        compressor = new TimedMethod(codecCode, (b, l) => lz4sharp_compressor64.Compress(b));
                        decompressor = new TimedMethod(codecCode, (b, l) =>
                            {
                                var output = new byte[l];
                                lz4sharp_decompressor64.DecompressKnownSize(b, output);
                                return output;
                            });
                    }
                    break;

                case "quicklz.native":
                    codecCode = string.Format("QuickLZ.native@{0}", architecture);
                    compressor = new TimedMethod(codecCode, NativeQuickLZCompressor);
                    decompressor = new TimedMethod(codecCode, NativeQuickLZDecompressor);
                    break;

                case "snappy.native":
                    codecCode = string.Format("Snappy.native@{0}", architecture);
                    compressor = new TimedMethod(codecCode, NativeSnappyCompressor);
                    decompressor = new TimedMethod(codecCode, NativeSnappyDecompressor);
                    break;

                // safe compressors

                case "lz4.safe":
                    codecCode = string.Format("LZ4.safe@{0}", architecture);
                    if (IntPtr.Size == 4)
                    {
                        compressor = new TimedMethod(codecCode, (b, l) => LZ4s.LZ4Codec.Encode32(b, 0, l));
                        decompressor = new TimedMethod(codecCode, (b, l) => LZ4s.LZ4Codec.Decode64(b, 0, b.Length, l));
                    }
                    else
                    {
                        compressor = new TimedMethod(codecCode, (b, l) => LZ4s.LZ4Codec.Encode32(b, 0, l));
                        decompressor = new TimedMethod(codecCode, (b, l) => LZ4s.LZ4Codec.Decode64(b, 0, b.Length, l));
                    }
                    break;

                case "lzf.safe":
                    codecCode = string.Format("LZF.safe@{0}", architecture);
                    compressor = new TimedMethod(codecCode, SafeLZFCompressor);
                    decompressor = new TimedMethod(codecCode, SafeLZFDecompressor);
                    break;

                case "quicklz1.safe":
                    codecCode = string.Format("QuickLZ1.safe@{0}", architecture);
                    compressor = new TimedMethod(codecCode, SafeQuickLZ1Compressor);
                    decompressor = new TimedMethod(codecCode, SafeQuickLZDecompressor);
                    break;

                case "quicklz3.safe":
                    codecCode = string.Format("QuickLZ3.safe@{0}", architecture);
                    compressor = new TimedMethod(codecCode, SafeQuickLZ3Compressor);
                    decompressor = new TimedMethod(codecCode, SafeQuickLZDecompressor);
                    break;

                case "deflate.safe":
                    codecCode = string.Format("Deflate.safe@{0}", architecture);
                    compressor = new TimedMethod(codecCode, DeflateCompressor);
                    decompressor = new TimedMethod(codecCode, DeflateDecompressor);
                    break;

                default:
                    throw new ArgumentException(string.Format("Unknown codec: {0}", codec));
            }
            return codecCode;
        }