diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-08-30 16:51:11 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2021-08-30 16:51:11 +0200 |
commit | 99531f22f32354317cc3dff9e5d48730270aafa7 (patch) | |
tree | bb33ab9c9f39eb4fd764a51f3a9b143bc5928a87 /vespajlib/src/main/java/com/yahoo/compress | |
parent | beea81233a2b9334aac10ed32d14ad9ad8f73d9a (diff) |
Avoid copying data just to compress them when it is not necessary.
Diffstat (limited to 'vespajlib/src/main/java/com/yahoo/compress')
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/compress/Compressor.java | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/compress/Compressor.java b/vespajlib/src/main/java/com/yahoo/compress/Compressor.java index 98228292cc7..1b20f1dcaf7 100644 --- a/vespajlib/src/main/java/com/yahoo/compress/Compressor.java +++ b/vespajlib/src/main/java/com/yahoo/compress/Compressor.java @@ -87,31 +87,38 @@ public class Compressor { public Compression compress(CompressionType requestedCompression, byte[] data, int offset, int len) { switch (requestedCompression) { case NONE: - if ((offset != 0) || (len != data.length)) { - data = Arrays.copyOfRange(data, offset, offset + len); - } - return new Compression(CompressionType.NONE, data.length, data); + return compact(CompressionType.NONE, data, offset, len); case LZ4: if (len < compressMinSizeBytes) return new Compression(CompressionType.INCOMPRESSIBLE, len, data); byte[] compressedData = getCompressor().compress(data, offset, len); - if (compressedData.length + 8 >= len * compressionThresholdFactor) - return new Compression(CompressionType.INCOMPRESSIBLE, len, data); + if (compressedData.length + 8 >= len * compressionThresholdFactor) { + return compact(CompressionType.INCOMPRESSIBLE, data, offset, len); + } return new Compression(CompressionType.LZ4, len, compressedData); case ZSTD: - if (len < compressMinSizeBytes) return new Compression(CompressionType.INCOMPRESSIBLE, len, data); + if (len < compressMinSizeBytes) { + return compact(CompressionType.INCOMPRESSIBLE, data, offset, len); + } byte[] compressed = zstdCompressor.compress(data, offset, len); return new Compression(CompressionType.ZSTD, len, compressed); default: throw new IllegalArgumentException(requestedCompression + " is not supported"); } } + + private Compression compact(CompressionType type, byte[] data, int offset, int len) { + if ((offset != 0) || (len != data.length)) { + data = Arrays.copyOfRange(data, offset, offset + len); + } + return new Compression(type, len, data); + } private LZ4Compressor getCompressor() { return level < 7 ? factory.fastCompressor() : factory.highCompressor(); } /** Compresses some data using the requested compression type */ - public Compression compress(CompressionType requestedCompression, byte[] data) { return compress(requestedCompression, data, Optional.empty()); } + public Compression compress(CompressionType requestedCompression, byte[] data) { return compress(requestedCompression, data, 0, data.length); } /** Compresses some data using the compression type of this compressor */ - public Compression compress(byte[] data, int uncompressedSize) { return compress(type, data, Optional.of(uncompressedSize)); } + public Compression compress(byte[] data, int uncompressedSize) { return compress(type, data, 0, uncompressedSize); } /** Compresses some data using the compression type of this compressor */ public Compression compress(byte[] data) { return compress(type, data, Optional.empty()); } |