[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