aboutsummaryrefslogtreecommitdiffstats
path: root/vespajlib/src/main/java/com/yahoo/compress
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-08-30 20:54:34 +0200
committerGitHub <noreply@github.com>2021-08-30 20:54:34 +0200
commit3ed41b3f9a87ade7a5e265e205b336ac7df9984e (patch)
treea4296d890eedba5d52c9e3d3018e778443cc4fd6 /vespajlib/src/main/java/com/yahoo/compress
parent2c08131faa2a3df78a47f4cdabd2ff7791d15c0c (diff)
Revert "Revert "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.java25
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()); }