aboutsummaryrefslogtreecommitdiffstats
path: root/vespajlib/src/main/java/com/yahoo/compress
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-08-30 16:51:11 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2021-08-30 16:51:11 +0200
commit99531f22f32354317cc3dff9e5d48730270aafa7 (patch)
treebb33ab9c9f39eb4fd764a51f3a9b143bc5928a87 /vespajlib/src/main/java/com/yahoo/compress
parentbeea81233a2b9334aac10ed32d14ad9ad8f73d9a (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.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()); }