6633613: (str) StringCoding optimizations to avoid unnecessary array copies with Charset arg

Martin Buchholz Martin.Buchholz at Sun.COM
Thu Feb 28 20:50:47 UTC 2008


I propose to partially fix

6633613: (str) StringCoding optimizations to avoid unnecessary array 
copies with Charset arg

with the patches below (a more ambitious patch will hopefully follow later):

Iris, please review.

Martin

First, warning suppression:

diff --git a/src/share/classes/java/lang/StringCoding.java 
b/src/share/classes/java/lang/StringCoding.java
--- a/src/share/classes/java/lang/StringCoding.java
+++ b/src/share/classes/java/lang/StringCoding.java
@@ -53,22 +53,23 @@ class StringCoding {

      private StringCoding() { }

-    /* The cached coders for each thread
-     */
-    private static ThreadLocal decoder = new ThreadLocal();
-    private static ThreadLocal encoder = new ThreadLocal();
+    /** The cached coders for each thread */
+    private final static ThreadLocal<SoftReference<StringDecoder>> 
decoder =
+        new ThreadLocal<SoftReference<StringDecoder>>();
+    private final static ThreadLocal<SoftReference<StringEncoder>> 
encoder =
+        new ThreadLocal<SoftReference<StringEncoder>>();

      private static boolean warnUnsupportedCharset = true;

-    private static Object deref(ThreadLocal tl) {
-        SoftReference sr = (SoftReference)tl.get();
+    private static <T> T deref(ThreadLocal<SoftReference<T>> tl) {
+        SoftReference<T> sr = tl.get();
          if (sr == null)
              return null;
          return sr.get();
      }

-    private static void set(ThreadLocal tl, Object ob) {
-        tl.set(new SoftReference(ob));
+    private static <T> void set(ThreadLocal<SoftReference<T>> tl, T ob) {
+        tl.set(new SoftReference<T>(ob));
      }

      // Trim the given byte array to the given length
@@ -174,7 +175,7 @@ class StringCoding {
      static char[] decode(String charsetName, byte[] ba, int off, int len)
          throws UnsupportedEncodingException
      {
-        StringDecoder sd = (StringDecoder)deref(decoder);
+        StringDecoder sd = deref(decoder);
          String csn = (charsetName == null) ? "ISO-8859-1" : charsetName;
          if ((sd == null) || !(csn.equals(sd.requestedCharsetName())
                                || csn.equals(sd.charsetName()))) {
@@ -273,7 +274,7 @@ class StringCoding {
      static byte[] encode(String charsetName, char[] ca, int off, int len)
          throws UnsupportedEncodingException
      {
-        StringEncoder se = (StringEncoder)deref(encoder);
+        StringEncoder se = deref(encoder);
          String csn = (charsetName == null) ? "ISO-8859-1" : charsetName;
          if ((se == null) || !(csn.equals(se.requestedCharsetName())
                                || csn.equals(se.charsetName()))) {


second, actual fix:

diff --git a/src/share/classes/java/lang/StringCoding.java 
b/src/share/classes/java/lang/StringCoding.java
--- a/src/share/classes/java/lang/StringCoding.java
+++ b/src/share/classes/java/lang/StringCoding.java
@@ -194,8 +194,7 @@ class StringCoding {

      static char[] decode(Charset cs, byte[] ba, int off, int len) {
          StringDecoder sd = new StringDecoder(cs, cs.name());
-        byte[] b = Arrays.copyOf(ba, ba.length);
-        return sd.decode(b, off, len);
+        return sd.decode(Arrays.copyOfRange(ba, off, off + len), 0, len);
      }

      static char[] decode(byte[] ba, int off, int len) {
@@ -293,8 +292,7 @@ class StringCoding {

      static byte[] encode(Charset cs, char[] ca, int off, int len) {
          StringEncoder se = new StringEncoder(cs, cs.name());
-        char[] c = Arrays.copyOf(ca, ca.length);
-        return se.encode(c, off, len);
+        return se.encode(Arrays.copyOfRange(ca, off, off + len), 0, len);
      }

      static byte[] encode(char[] ca, int off, int len) {



More information about the core-libs-dev mailing list