< prev index next >
src/java.base/share/classes/java/lang/StringCoding.java
Print this page
rev 56460 : 8231717: Improve performance of charset decoding when charset is always compactable
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
@@ -189,10 +189,16 @@
LATIN1);
} else {
return result.with(StringLatin1.inflate(ba, off, len), UTF16);
}
}
+ // fastpath for always compactable single byte
+ if (COMPACT_STRINGS && cd instanceof ArrayDecoder && ((ArrayDecoder)cd).isAlwaysCompactable()) {
+ byte[] dst = new byte[len];
+ ((ArrayDecoder)cd).decodeToLatin1(ba, off, len, dst);
+ return result.with(dst, LATIN1);
+ }
int en = scale(len, cd.maxCharsPerByte());
char[] ca = new char[en];
if (cd instanceof ArrayDecoder) {
int clen = ((ArrayDecoder)cd).decode(ba, off, len, ca);
return result.with(ca, 0, clen);
@@ -276,10 +282,17 @@
// ascii fastpath
if ((cd instanceof ArrayDecoder) &&
((ArrayDecoder)cd).isASCIICompatible() && !hasNegatives(ba, off, len)) {
return decodeLatin1(ba, off, len);
}
+ // fastpath for always compactable single byte
+ if (COMPACT_STRINGS && cd instanceof ArrayDecoder && ((ArrayDecoder)cd).isAlwaysCompactable()) {
+ byte[] dst = new byte[len];
+ ((ArrayDecoder)cd).decodeToLatin1(ba, off, len, dst);
+ return new Result().with(dst, LATIN1);
+ }
+
int en = scale(len, cd.maxCharsPerByte());
if (len == 0) {
return new Result().with();
}
cd.onMalformedInput(CodingErrorAction.REPLACE)
< prev index next >