Minimize byte array allocation by AbstractData{Input,Output}
patch by Pavel Yaskevich; reviewed by Jonathan Ellis for CASSANDRA-5090


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/38757c4b
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/38757c4b
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/38757c4b

Branch: refs/heads/trunk
Commit: 38757c4b2782bbfc837faee00199d373b645cb76
Parents: f4700ed
Author: Pavel Yaskevich <xe...@apache.org>
Authored: Tue Dec 25 19:23:38 2012 -0800
Committer: Pavel Yaskevich <xe...@apache.org>
Committed: Tue Dec 25 19:54:19 2012 -0800

----------------------------------------------------------------------
 CHANGES.txt                                        |    1 +
 .../cassandra/io/util/AbstractDataInput.java       |   47 ++++++---------
 .../cassandra/io/util/AbstractDataOutput.java      |   35 ++++-------
 3 files changed, 34 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/38757c4b/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 401a9af..404cdbe 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -11,6 +11,7 @@
    method (CASSANDRA-4939)
  * Expose black-listed directories via JMX (CASSANDRA-4848)
  * Log compaction merge counts (CASSANDRA-4894)
+ * Minimize byte array allocation by AbstractData{Input,Output} 
(CASSANDRA-5090)
 
 
 1.2.0

http://git-wip-us.apache.org/repos/asf/cassandra/blob/38757c4b/src/java/org/apache/cassandra/io/util/AbstractDataInput.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/util/AbstractDataInput.java 
b/src/java/org/apache/cassandra/io/util/AbstractDataInput.java
index b0766a4..ff8b6b2 100644
--- a/src/java/org/apache/cassandra/io/util/AbstractDataInput.java
+++ b/src/java/org/apache/cassandra/io/util/AbstractDataInput.java
@@ -78,11 +78,11 @@ public abstract class AbstractDataInput extends InputStream 
implements DataInput
      *             if this file is closed or another I/O error occurs.
      */
     public final char readChar() throws IOException {
-        byte[] buffer = new byte[2];
-        if (read(buffer, 0, buffer.length) != buffer.length) {
+        int ch1 = this.read();
+        int ch2 = this.read();
+        if ((ch1 | ch2) < 0)
             throw new EOFException();
-        }
-        return (char) (((buffer[0] & 0xff) << 8) + (buffer[1] & 0xff));
+        return (char)((ch1 << 8) + (ch2 << 0));
     }
 
     /**
@@ -188,12 +188,13 @@ public abstract class AbstractDataInput extends 
InputStream implements DataInput
      *             if this file is closed or another I/O error occurs.
      */
     public int readInt() throws IOException {
-        byte[] buffer = new byte[4];
-        if (read(buffer, 0, buffer.length) != buffer.length) {
+        int ch1 = this.read();
+        int ch2 = this.read();
+        int ch3 = this.read();
+        int ch4 = this.read();
+        if ((ch1 | ch2 | ch3 | ch4) < 0)
             throw new EOFException();
-        }
-        return ((buffer[0] & 0xff) << 24) + ((buffer[1] & 0xff) << 16)
-                + ((buffer[2] & 0xff) << 8) + (buffer[3] & 0xff);
+        return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
     }
 
     /**
@@ -252,17 +253,7 @@ public abstract class AbstractDataInput extends 
InputStream implements DataInput
      *             if this file is closed or another I/O error occurs.
      */
     public long readLong() throws IOException {
-        byte[] buffer = new byte[8];
-        int n = read(buffer, 0, buffer.length);
-        if (n != buffer.length) {
-            throw new EOFException("expected 8 bytes; read " + n + " at final 
position " + getPosition());
-        }
-        return ((long) (((buffer[0] & 0xff) << 24) + ((buffer[1] & 0xff) << 16)
-                + ((buffer[2] & 0xff) << 8) + (buffer[3] & 0xff)) << 32)
-                + ((long) (buffer[4] & 0xff) << 24)
-                + ((buffer[5] & 0xff) << 16)
-                + ((buffer[6] & 0xff) << 8)
-                + (buffer[7] & 0xff);
+        return ((long)(readInt()) << 32) + (readInt() & 0xFFFFFFFFL);
     }
 
     /**
@@ -277,11 +268,11 @@ public abstract class AbstractDataInput extends 
InputStream implements DataInput
      *             if this file is closed or another I/O error occurs.
      */
     public short readShort() throws IOException {
-        byte[] buffer = new byte[2];
-        if (read(buffer, 0, buffer.length) != buffer.length) {
+        int ch1 = this.read();
+        int ch2 = this.read();
+        if ((ch1 | ch2) < 0)
             throw new EOFException();
-        }
-        return (short) (((buffer[0] & 0xff) << 8) + (buffer[1] & 0xff));
+        return (short)((ch1 << 8) + (ch2 << 0));
     }
 
     /**
@@ -315,11 +306,11 @@ public abstract class AbstractDataInput extends 
InputStream implements DataInput
      *             if this file is closed or another I/O error occurs.
      */
     public int readUnsignedShort() throws IOException {
-        byte[] buffer = new byte[2];
-        if (read(buffer, 0, buffer.length) != buffer.length) {
+        int ch1 = this.read();
+        int ch2 = this.read();
+        if ((ch1 | ch2) < 0)
             throw new EOFException();
-        }
-        return ((buffer[0] & 0xff) << 8) + (buffer[1] & 0xff);
+        return (ch1 << 8) + (ch2 << 0);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/cassandra/blob/38757c4b/src/java/org/apache/cassandra/io/util/AbstractDataOutput.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/util/AbstractDataOutput.java 
b/src/java/org/apache/cassandra/io/util/AbstractDataOutput.java
index be26094..149d82a 100644
--- a/src/java/org/apache/cassandra/io/util/AbstractDataOutput.java
+++ b/src/java/org/apache/cassandra/io/util/AbstractDataOutput.java
@@ -135,10 +135,8 @@ public abstract class AbstractDataOutput extends 
OutputStream implements DataOut
      *             DataOutputStream.
      */
     public final void writeChar(int val) throws IOException {
-        byte[] buffer = new byte[2];
-        buffer[0] = (byte) (val >> 8);
-        buffer[1] = (byte) val;
-        write(buffer, 0, buffer.length);
+        write((val >>> 8) & 0xFF);
+        write((val >>> 0) & 0xFF);
     }
 
     /**
@@ -206,12 +204,10 @@ public abstract class AbstractDataOutput extends 
OutputStream implements DataOut
      *             DataOutputStream.
      */
     public void writeInt(int val) throws IOException {
-        byte[] buffer = new byte[4];
-        buffer[0] = (byte) (val >> 24);
-        buffer[1] = (byte) (val >> 16);
-        buffer[2] = (byte) (val >> 8);
-        buffer[3] = (byte) val;
-        write(buffer, 0, buffer.length);
+        write((val >>> 24) & 0xFF);
+        write((val >>> 16) & 0xFF);
+        write((val >>>  8) & 0xFF);
+        write((val >>>  0) & 0xFF);
     }
 
     /**
@@ -226,17 +222,14 @@ public abstract class AbstractDataOutput extends 
OutputStream implements DataOut
      *             DataOutputStream.
      */
     public void writeLong(long val) throws IOException {
-        byte[] buffer = new byte[8];
-        int t = (int) (val >> 32);
-        buffer[0] = (byte) (t >> 24);
-        buffer[1] = (byte) (t >> 16);
-        buffer[2] = (byte) (t >> 8);
-        buffer[3] = (byte) t;
-        buffer[4] = (byte) (val >> 24);
-        buffer[5] = (byte) (val >> 16);
-        buffer[6] = (byte) (val >> 8);
-        buffer[7] = (byte) val;
-        write(buffer, 0, buffer.length);
+        write((int)(val >>> 56) & 0xFF);
+        write((int)(val >>> 48) & 0xFF);
+        write((int)(val >>> 40) & 0xFF);
+        write((int)(val >>> 32) & 0xFF);
+        write((int)(val >>> 24) & 0xFF);
+        write((int)(val >>> 16) & 0xFF);
+        write((int)(val >>>  8) & 0xFF);
+        write((int)(val >>>  0) & 0xFF);
     }
 
     /**

Reply via email to