aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLasse Collin <lasse.collin@tukaani.org>2014-03-03 17:02:13 +0200
committerLasse Collin <lasse.collin@tukaani.org>2014-03-03 17:05:02 +0200
commita9bf23ff908ac7f8f4df25fd621e04e187425a7d (patch)
tree59283614cb0c21eac8f7d87d0506363230048552
parent52d13bf94e56328f0256a4017958864d4f9b1e2c (diff)
downloadxz-java-a9bf23ff908ac7f8f4df25fd621e04e187425a7d.tar.gz
Use fields for temp buffers in read() and write(int).
This avoids reallocating memory for each call. This reduces pressure on the garbage collector and in practice lowers the memory used by the java process significantly when read() and write(int) functions are used a lot. On the other hand, this is stupid since most of the time the read() and write(int) aren't (hopefully) used since one gets better performance with functions that process arrays of bytes. Thus, for most uses cases this commit means that we are allocating a few unused one-byte buffers that weren't previously allocated at all. Similar thing was done earlier in the LZMA encoder in the commit ec224582e44776a53874346dfe703dbbfcc6bd15.
-rw-r--r--src/org/tukaani/xz/BlockInputStream.java5
-rw-r--r--src/org/tukaani/xz/BlockOutputStream.java7
-rw-r--r--src/org/tukaani/xz/DeltaInputStream.java5
-rw-r--r--src/org/tukaani/xz/DeltaOutputStream.java7
-rw-r--r--src/org/tukaani/xz/LZMA2InputStream.java5
-rw-r--r--src/org/tukaani/xz/LZMA2OutputStream.java7
-rw-r--r--src/org/tukaani/xz/LZMAInputStream.java5
-rw-r--r--src/org/tukaani/xz/SeekableXZInputStream.java9
-rw-r--r--src/org/tukaani/xz/SimpleInputStream.java5
-rw-r--r--src/org/tukaani/xz/SimpleOutputStream.java7
-rw-r--r--src/org/tukaani/xz/SingleXZInputStream.java5
-rw-r--r--src/org/tukaani/xz/UncompressedLZMA2OutputStream.java7
-rw-r--r--src/org/tukaani/xz/XZInputStream.java5
-rw-r--r--src/org/tukaani/xz/XZOutputStream.java6
14 files changed, 52 insertions, 33 deletions
diff --git a/src/org/tukaani/xz/BlockInputStream.java b/src/org/tukaani/xz/BlockInputStream.java
index cf19b75..b5b8eca 100644
--- a/src/org/tukaani/xz/BlockInputStream.java
+++ b/src/org/tukaani/xz/BlockInputStream.java
@@ -31,6 +31,8 @@ class BlockInputStream extends InputStream {
private long uncompressedSize = 0;
private boolean endReached = false;
+ private final byte[] tempBuf = new byte[1];
+
public BlockInputStream(InputStream in, Check check, int memoryLimit,
long unpaddedSizeInIndex,
long uncompressedSizeInIndex)
@@ -196,8 +198,7 @@ class BlockInputStream extends InputStream {
}
public int read() throws IOException {
- byte[] buf = new byte[1];
- return read(buf, 0, 1) == -1 ? -1 : (buf[0] & 0xFF);
+ return read(tempBuf, 0, 1) == -1 ? -1 : (tempBuf[0] & 0xFF);
}
public int read(byte[] buf, int off, int len) throws IOException {
diff --git a/src/org/tukaani/xz/BlockOutputStream.java b/src/org/tukaani/xz/BlockOutputStream.java
index 1f907e1..03fd0a9 100644
--- a/src/org/tukaani/xz/BlockOutputStream.java
+++ b/src/org/tukaani/xz/BlockOutputStream.java
@@ -25,6 +25,8 @@ class BlockOutputStream extends FinishableOutputStream {
private final long compressedSizeLimit;
private long uncompressedSize = 0;
+ private final byte[] tempBuf = new byte[1];
+
public BlockOutputStream(OutputStream out, FilterEncoder[] filters,
Check check) throws IOException {
this.out = out;
@@ -83,9 +85,8 @@ class BlockOutputStream extends FinishableOutputStream {
}
public void write(int b) throws IOException {
- byte[] buf = new byte[1];
- buf[0] = (byte)b;
- write(buf, 0, 1);
+ tempBuf[0] = (byte)b;
+ write(tempBuf, 0, 1);
}
public void write(byte[] buf, int off, int len) throws IOException {
diff --git a/src/org/tukaani/xz/DeltaInputStream.java b/src/org/tukaani/xz/DeltaInputStream.java
index 10cc35c..56478f5 100644
--- a/src/org/tukaani/xz/DeltaInputStream.java
+++ b/src/org/tukaani/xz/DeltaInputStream.java
@@ -36,6 +36,8 @@ public class DeltaInputStream extends InputStream {
private IOException exception = null;
+ private final byte[] tempBuf = new byte[1];
+
/**
* Creates a new Delta decoder with the given delta calculation distance.
*
@@ -65,8 +67,7 @@ public class DeltaInputStream extends InputStream {
* @throws IOException may be thrown by <code>in</code>
*/
public int read() throws IOException {
- byte[] buf = new byte[1];
- return read(buf, 0, 1) == -1 ? -1 : (buf[0] & 0xFF);
+ return read(tempBuf, 0, 1) == -1 ? -1 : (tempBuf[0] & 0xFF);
}
/**
diff --git a/src/org/tukaani/xz/DeltaOutputStream.java b/src/org/tukaani/xz/DeltaOutputStream.java
index b58ec80..332fd8f 100644
--- a/src/org/tukaani/xz/DeltaOutputStream.java
+++ b/src/org/tukaani/xz/DeltaOutputStream.java
@@ -22,6 +22,8 @@ class DeltaOutputStream extends FinishableOutputStream {
private boolean finished = false;
private IOException exception = null;
+ private final byte[] tempBuf = new byte[1];
+
static int getMemoryUsage() {
return 1 + TMPBUF_SIZE / 1024;
}
@@ -32,9 +34,8 @@ class DeltaOutputStream extends FinishableOutputStream {
}
public void write(int b) throws IOException {
- byte[] buf = new byte[1];
- buf[0] = (byte)b;
- write(buf, 0, 1);
+ tempBuf[0] = (byte)b;
+ write(tempBuf, 0, 1);
}
public void write(byte[] buf, int off, int len) throws IOException {
diff --git a/src/org/tukaani/xz/LZMA2InputStream.java b/src/org/tukaani/xz/LZMA2InputStream.java
index 7234e07..4e865c6 100644
--- a/src/org/tukaani/xz/LZMA2InputStream.java
+++ b/src/org/tukaani/xz/LZMA2InputStream.java
@@ -59,6 +59,8 @@ public class LZMA2InputStream extends InputStream {
private IOException exception = null;
+ private final byte[] tempBuf = new byte[1];
+
/**
* Gets approximate decompressor memory requirements as kibibytes for
* the given dictionary size.
@@ -166,8 +168,7 @@ public class LZMA2InputStream extends InputStream {
* @throws IOException may be thrown by <code>in</code>
*/
public int read() throws IOException {
- byte[] buf = new byte[1];
- return read(buf, 0, 1) == -1 ? -1 : (buf[0] & 0xFF);
+ return read(tempBuf, 0, 1) == -1 ? -1 : (tempBuf[0] & 0xFF);
}
/**
diff --git a/src/org/tukaani/xz/LZMA2OutputStream.java b/src/org/tukaani/xz/LZMA2OutputStream.java
index 0865a14..5724d10 100644
--- a/src/org/tukaani/xz/LZMA2OutputStream.java
+++ b/src/org/tukaani/xz/LZMA2OutputStream.java
@@ -35,6 +35,8 @@ class LZMA2OutputStream extends FinishableOutputStream {
private boolean finished = false;
private IOException exception = null;
+ private final byte[] tempBuf = new byte[1];
+
private static int getExtraSizeBefore(int dictSize) {
return COMPRESSED_SIZE_MAX > dictSize
? COMPRESSED_SIZE_MAX - dictSize : 0;
@@ -77,9 +79,8 @@ class LZMA2OutputStream extends FinishableOutputStream {
}
public void write(int b) throws IOException {
- byte[] buf = new byte[1];
- buf[0] = (byte)b;
- write(buf, 0, 1);
+ tempBuf[0] = (byte)b;
+ write(tempBuf, 0, 1);
}
public void write(byte[] buf, int off, int len) throws IOException {
diff --git a/src/org/tukaani/xz/LZMAInputStream.java b/src/org/tukaani/xz/LZMAInputStream.java
index f03fc7f..9bbd261 100644
--- a/src/org/tukaani/xz/LZMAInputStream.java
+++ b/src/org/tukaani/xz/LZMAInputStream.java
@@ -53,6 +53,8 @@ public class LZMAInputStream extends InputStream {
private boolean endReached = false;
+ private final byte[] tempBuf = new byte[1];
+
/**
* Number of uncompressed bytes left to be decompressed, or -1 if
* the end marker is used.
@@ -439,8 +441,7 @@ public class LZMAInputStream extends InputStream {
* @throws IOException may be thrown by <code>in</code>
*/
public int read() throws IOException {
- byte[] buf = new byte[1];
- return read(buf, 0, 1) == -1 ? -1 : (buf[0] & 0xFF);
+ return read(tempBuf, 0, 1) == -1 ? -1 : (tempBuf[0] & 0xFF);
}
/**
diff --git a/src/org/tukaani/xz/SeekableXZInputStream.java b/src/org/tukaani/xz/SeekableXZInputStream.java
index b54936d..eb5573e 100644
--- a/src/org/tukaani/xz/SeekableXZInputStream.java
+++ b/src/org/tukaani/xz/SeekableXZInputStream.java
@@ -170,6 +170,12 @@ public class SeekableXZInputStream extends SeekableInputStream {
private IOException exception = null;
/**
+ * Temporary buffer for read(). This avoids reallocating memory
+ * on every read() call.
+ */
+ private final byte[] tempBuf = new byte[1];
+
+ /**
* Creates a new seekable XZ decompressor without a memory usage limit.
*
* @param in seekable input stream containing one or more
@@ -544,8 +550,7 @@ public class SeekableXZInputStream extends SeekableInputStream {
* @throws IOException may be thrown by <code>in</code>
*/
public int read() throws IOException {
- byte[] buf = new byte[1];
- return read(buf, 0, 1) == -1 ? -1 : (buf[0] & 0xFF);
+ return read(tempBuf, 0, 1) == -1 ? -1 : (tempBuf[0] & 0xFF);
}
/**
diff --git a/src/org/tukaani/xz/SimpleInputStream.java b/src/org/tukaani/xz/SimpleInputStream.java
index e187b72..669f280 100644
--- a/src/org/tukaani/xz/SimpleInputStream.java
+++ b/src/org/tukaani/xz/SimpleInputStream.java
@@ -27,6 +27,8 @@ class SimpleInputStream extends InputStream {
private boolean endReached = false;
private IOException exception = null;
+ private final byte[] tempBuf = new byte[1];
+
static int getMemoryUsage() {
return 1 + TMPBUF_SIZE / 1024;
}
@@ -46,8 +48,7 @@ class SimpleInputStream extends InputStream {
}
public int read() throws IOException {
- byte[] buf = new byte[1];
- return read(buf, 0, 1) == -1 ? -1 : (buf[0] & 0xFF);
+ return read(tempBuf, 0, 1) == -1 ? -1 : (tempBuf[0] & 0xFF);
}
public int read(byte[] buf, int off, int len) throws IOException {
diff --git a/src/org/tukaani/xz/SimpleOutputStream.java b/src/org/tukaani/xz/SimpleOutputStream.java
index 377a208..7d1cc58 100644
--- a/src/org/tukaani/xz/SimpleOutputStream.java
+++ b/src/org/tukaani/xz/SimpleOutputStream.java
@@ -25,6 +25,8 @@ class SimpleOutputStream extends FinishableOutputStream {
private IOException exception = null;
private boolean finished = false;
+ private final byte[] tempBuf = new byte[1];
+
static int getMemoryUsage() {
return 1 + TMPBUF_SIZE / 1024;
}
@@ -39,9 +41,8 @@ class SimpleOutputStream extends FinishableOutputStream {
}
public void write(int b) throws IOException {
- byte[] buf = new byte[1];
- buf[0] = (byte)b;
- write(buf, 0, 1);
+ tempBuf[0] = (byte)b;
+ write(tempBuf, 0, 1);
}
public void write(byte[] buf, int off, int len) throws IOException {
diff --git a/src/org/tukaani/xz/SingleXZInputStream.java b/src/org/tukaani/xz/SingleXZInputStream.java
index dad7275..a273fdd 100644
--- a/src/org/tukaani/xz/SingleXZInputStream.java
+++ b/src/org/tukaani/xz/SingleXZInputStream.java
@@ -49,6 +49,8 @@ public class SingleXZInputStream extends InputStream {
private boolean endReached = false;
private IOException exception = null;
+ private final byte[] tempBuf = new byte[1];
+
/**
* Creates a new XZ decompressor that decompresses exactly one
* XZ Stream from <code>in</code> without a memory usage limit.
@@ -175,8 +177,7 @@ public class SingleXZInputStream extends InputStream {
* @throws IOException may be thrown by <code>in</code>
*/
public int read() throws IOException {
- byte[] buf = new byte[1];
- return read(buf, 0, 1) == -1 ? -1 : (buf[0] & 0xFF);
+ return read(tempBuf, 0, 1) == -1 ? -1 : (tempBuf[0] & 0xFF);
}
/**
diff --git a/src/org/tukaani/xz/UncompressedLZMA2OutputStream.java b/src/org/tukaani/xz/UncompressedLZMA2OutputStream.java
index c62ced0..1ff9675 100644
--- a/src/org/tukaani/xz/UncompressedLZMA2OutputStream.java
+++ b/src/org/tukaani/xz/UncompressedLZMA2OutputStream.java
@@ -24,6 +24,8 @@ class UncompressedLZMA2OutputStream extends FinishableOutputStream {
private boolean finished = false;
private IOException exception = null;
+ private final byte[] tempBuf = new byte[1];
+
static int getMemoryUsage() {
// uncompBuf + a little extra
return 70;
@@ -38,9 +40,8 @@ class UncompressedLZMA2OutputStream extends FinishableOutputStream {
}
public void write(int b) throws IOException {
- byte[] buf = new byte[1];
- buf[0] = (byte)b;
- write(buf, 0, 1);
+ tempBuf[0] = (byte)b;
+ write(tempBuf, 0, 1);
}
public void write(byte[] buf, int off, int len) throws IOException {
diff --git a/src/org/tukaani/xz/XZInputStream.java b/src/org/tukaani/xz/XZInputStream.java
index e6a11dc..bfd71f4 100644
--- a/src/org/tukaani/xz/XZInputStream.java
+++ b/src/org/tukaani/xz/XZInputStream.java
@@ -67,6 +67,8 @@ public class XZInputStream extends InputStream {
private boolean endReached = false;
private IOException exception = null;
+ private final byte[] tempBuf = new byte[1];
+
/**
* Creates a new XZ decompressor without a memory usage limit.
* <p>
@@ -154,8 +156,7 @@ public class XZInputStream extends InputStream {
* @throws IOException may be thrown by <code>in</code>
*/
public int read() throws IOException {
- byte[] buf = new byte[1];
- return read(buf, 0, 1) == -1 ? -1 : (buf[0] & 0xFF);
+ return read(tempBuf, 0, 1) == -1 ? -1 : (tempBuf[0] & 0xFF);
}
/**
diff --git a/src/org/tukaani/xz/XZOutputStream.java b/src/org/tukaani/xz/XZOutputStream.java
index 33c7c4a..6a37fed 100644
--- a/src/org/tukaani/xz/XZOutputStream.java
+++ b/src/org/tukaani/xz/XZOutputStream.java
@@ -70,6 +70,8 @@ public class XZOutputStream extends FinishableOutputStream {
private IOException exception = null;
private boolean finished = false;
+ private final byte[] tempBuf = new byte[1];
+
/**
* Creates a new XZ compressor using one filter and CRC64 as
* the integrity check. This constructor is equivalent to passing
@@ -235,8 +237,8 @@ public class XZOutputStream extends FinishableOutputStream {
* @throws IOException may be thrown by the underlying output stream
*/
public void write(int b) throws IOException {
- byte[] buf = new byte[] { (byte)b };
- write(buf, 0, 1);
+ tempBuf[0] = (byte)b;
+ write(tempBuf, 0, 1);
}
/**