summaryrefslogtreecommitdiff
path: root/java/src/IceInternal/BasicStream.java
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2006-06-06 21:25:16 +0000
committerMark Spruiell <mes@zeroc.com>2006-06-06 21:25:16 +0000
commit0acfb47fbb0b0a790ab0900cf65e41ded499ce77 (patch)
tree6693ce73f1caf223967ae4a22e181268726b3230 /java/src/IceInternal/BasicStream.java
parentRemoved OA::destroy (diff)
downloadice-0acfb47fbb0b0a790ab0900cf65e41ded499ce77.tar.bz2
ice-0acfb47fbb0b0a790ab0900cf65e41ded499ce77.tar.xz
ice-0acfb47fbb0b0a790ab0900cf65e41ded499ce77.zip
optimizations for writeStartEncaps, writeString
Diffstat (limited to 'java/src/IceInternal/BasicStream.java')
-rw-r--r--java/src/IceInternal/BasicStream.java75
1 files changed, 60 insertions, 15 deletions
diff --git a/java/src/IceInternal/BasicStream.java b/java/src/IceInternal/BasicStream.java
index 389ac5a0577..84a25a064c7 100644
--- a/java/src/IceInternal/BasicStream.java
+++ b/java/src/IceInternal/BasicStream.java
@@ -315,6 +315,13 @@ public class BasicStream
--_seqDataStack.numElements;
}
+ final private static byte[] _encapsBlob =
+ {
+ 0, 0, 0, 0, // Placeholder for the encapsulation length.
+ Protocol.encodingMajor,
+ Protocol.encodingMinor
+ };
+
public void
startWriteEncaps()
{
@@ -334,9 +341,7 @@ public class BasicStream
}
_writeEncapsStack.start = _buf.position();
- writeInt(0); // Placeholder for the encapsulation length.
- writeByte(Protocol.encodingMajor);
- writeByte(Protocol.encodingMinor);
+ writeBlob(_encapsBlob);
}
public void
@@ -1014,6 +1019,9 @@ public class BasicStream
}
}
+ final static java.nio.charset.Charset _utf8 = java.nio.charset.Charset.forName("UTF8");
+ private java.nio.charset.CharsetEncoder _charEncoder = null;
+
public void
writeString(String v)
{
@@ -1026,17 +1034,51 @@ public class BasicStream
final int len = v.length();
if(len > 0)
{
- try
- {
- byte[] arr = v.getBytes("UTF8");
- writeSize(arr.length);
- expand(arr.length);
- _buf.put(arr);
- }
- catch(java.io.UnsupportedEncodingException ex)
- {
- assert(false);
- }
+ if(_stringBytes == null || len > _stringBytes.length)
+ {
+ _stringBytes = new byte[len];
+ }
+ if(_stringChars == null || len > _stringChars.length)
+ {
+ _stringChars = new char[len];
+ }
+ //
+ // If the string contains only 7-bit characters, it's more efficient
+ // to perform the conversion to UTF-8 manually.
+ //
+ v.getChars(0, len, _stringChars, 0);
+ for(int i = 0; i < len; ++i)
+ {
+ if(_stringChars[i] > (char)127)
+ {
+ //
+ // Found a multibyte character.
+ //
+ if(_charEncoder == null)
+ {
+ _charEncoder = _utf8.newEncoder();
+ }
+ java.nio.ByteBuffer b = null;
+ try
+ {
+ b = _charEncoder.encode(java.nio.CharBuffer.wrap(_stringChars, 0, len));
+ }
+ catch(java.nio.charset.CharacterCodingException ex)
+ {
+ Ice.MarshalException e = new Ice.MarshalException();
+ e.initCause(ex);
+ throw e;
+ }
+ writeSize(b.limit());
+ expand(b.limit());
+ _buf.put(b);
+ return;
+ }
+ _stringBytes[i] = (byte)_stringChars[i];
+ }
+ writeSize(len);
+ expand(len);
+ _buf.put(_stringBytes, 0, len);
}
else
{
@@ -1077,11 +1119,14 @@ public class BasicStream
{
//
// We reuse the _stringBytes array to avoid creating
- // excessive garbage
+ // excessive garbage.
//
if(_stringBytes == null || len > _stringBytes.length)
{
_stringBytes = new byte[len];
+ }
+ if(_stringChars == null || len > _stringChars.length)
+ {
_stringChars = new char[len];
}
_buf.get(_stringBytes, 0, len);