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