[Patch] java.nio - buffer optimizations

Michael Koch konqueror@gmx.de
Wed Apr 20 06:06:00 GMT 2005


Hi list,


I just commited the attached patch to merge some java.nio buffer
optimizations from GNU classpath to HEAD.


Michael


2005-04-20  Sven de Marothy  <sven@physto.se>

	* java/nio/ByteBufferImpl.java:
	(putChar): Inlined for speed.
	(put, get): Bulk methods can use arraycopy.
	* java/nio/CharBufferImpl.java:
	(put, get): Bulk methods can use arraycopy.

2005-04-20  Jeroen Frijters  <jeroen@frijters.net>

	* java/nio/ByteBufferImpl.java (get(), put(byte)): Inlined checks
	and field updates.
	* java/nio/CharBufferImpl.java
	(CharBufferImpl(CharBufferImpl)): Copy array_offset field.
	(get(), put(char)): Inlined checks and field updates. Fixed to
	take array_offset into account.
	(get(int), put(int, char)): Fixed to take array_offset into account.

-------------- next part --------------
Index: java/nio/ByteBufferImpl.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/nio/ByteBufferImpl.java,v
retrieving revision 1.10
diff -u -r1.10 ByteBufferImpl.java
--- java/nio/ByteBufferImpl.java	17 Feb 2005 18:13:03 -0000	1.10
+++ java/nio/ByteBufferImpl.java	20 Apr 2005 06:04:42 -0000
@@ -144,13 +144,43 @@
    */
   public byte get ()
   {
-    checkForUnderflow();
+    if (pos >= limit)
+        throw new BufferUnderflowException();
 
-    byte result = backing_buffer [position () + array_offset];
-    position (position () + 1);
-    return result;
+    return backing_buffer [(pos++) + array_offset];
   }
-  
+
+  /**
+   * Bulk get
+   */
+  public ByteBuffer get (byte[] dst, int offset, int length)
+  {
+    checkArraySize(dst.length, offset, length);
+    if ( (limit - pos) < length) // check for overflow
+      throw new BufferUnderflowException();
+
+    System.arraycopy(backing_buffer, pos + array_offset, 
+		     dst, offset, length);
+    pos += length;
+
+    return this;
+  }
+
+  /**
+   * Relative bulk put(), overloads the ByteBuffer impl.
+   */
+  public ByteBuffer put (byte[] src, int offset, int length)
+  {
+    if ( (limit - pos) < length) // check for overflow
+      throw new BufferOverflowException();
+    checkArraySize(src.length, offset, length);
+
+    System.arraycopy(src, offset, backing_buffer, pos + array_offset, length);
+    pos += length;
+
+    return this;
+  }
+
   /**
    * Relative put method. Writes <code>value</code> to the next position
    * in the buffer.
@@ -161,12 +191,12 @@
    */
   public ByteBuffer put (byte value)
   {
-    checkIfReadOnly();
-    checkForOverflow();
+    if (readOnly)
+        throw new ReadOnlyBufferException();
+    if (pos >= limit)
+        throw new BufferOverflowException();
 
-    int pos = position();
-    backing_buffer [pos + array_offset] = value;
-    position (pos + 1);
+    backing_buffer [(pos++) + array_offset] = value;
     return this;
   }
   
@@ -208,7 +238,21 @@
   
   public ByteBuffer putChar (char value)
   {
-    ByteBufferHelper.putChar(this, value, order());
+    if (readOnly)
+      throw new ReadOnlyBufferException ();
+    if ( (limit-pos) < 2)
+      throw new BufferOverflowException();
+
+    if (endian == ByteOrder.LITTLE_ENDIAN)
+      {
+        backing_buffer [(pos++) + array_offset] = (byte)(value&0xFF);
+        backing_buffer [(pos++) + array_offset] = (byte)(value>>8);
+      }
+    else
+      {
+        backing_buffer [(pos++) + array_offset] = (byte)(value>>8);
+        backing_buffer [(pos++) + array_offset] = (byte)(value&0xFF);
+      }
     return this;
   }
   
Index: java/nio/CharBufferImpl.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/nio/CharBufferImpl.java,v
retrieving revision 1.6
diff -u -r1.6 CharBufferImpl.java
--- java/nio/CharBufferImpl.java	17 Feb 2005 18:13:04 -0000	1.6
+++ java/nio/CharBufferImpl.java	20 Apr 2005 06:04:42 -0000
@@ -62,6 +62,7 @@
   {
     super (copy.capacity (), copy.limit (), copy.position (), 0);
     backing_buffer = copy.backing_buffer;
+    array_offset = copy.array_offset;
     readOnly = copy.isReadOnly ();
   }
   
@@ -127,11 +128,10 @@
    */
   public char get ()
   {
-    checkForUnderflow();
+    if (pos >= limit)
+        throw new BufferUnderflowException();
 
-    char result = backing_buffer [position ()];
-    position (position () + 1);
-    return result;
+    return backing_buffer [(pos++) + array_offset];
   }
   
   /**
@@ -142,10 +142,12 @@
    */
   public CharBuffer put (char value)
   {
-    checkIfReadOnly();
-	  	    
-    backing_buffer [position ()] = value;
-    position (position () + 1);
+    if (readOnly)
+        throw new ReadOnlyBufferException();
+    if (pos >= limit)
+        throw new BufferOverflowException();
+
+    backing_buffer [(pos++) + array_offset] = value;
     return this;
   }
   
@@ -162,10 +164,38 @@
   {
     checkIndex(index);
     
-    return backing_buffer [index];
+    return backing_buffer [index + array_offset];
   }
   
   /**
+   * Bulk get, overloaded for speed.
+   */
+  public CharBuffer get (char[] dst, int offset, int length)
+  {
+    checkArraySize(dst.length, offset, length);
+    checkForUnderflow(length);
+
+    System.arraycopy(backing_buffer, pos + array_offset, 
+		     dst, offset, length);
+    pos += length;
+    return this;
+  }
+
+  /**
+   * Bulk put, overloaded for speed.
+   */
+  public CharBuffer put (char[] src, int offset, int length)
+  {
+    checkArraySize(src.length, offset, length);
+    checkForOverflow(length);
+		    
+    System.arraycopy(src, offset,
+		     backing_buffer, pos + array_offset, length);
+    pos += length;
+    return this;
+  }
+
+  /**
    * Absolute put method. Writes <code>value</code> to position
    * <code>index</code> in the buffer.
    *
@@ -178,7 +208,7 @@
     checkIndex(index);
     checkIfReadOnly();
     	    
-    backing_buffer [index] = value;
+    backing_buffer [index + array_offset] = value;
     return this;
   }
   


More information about the Java-patches mailing list