RFR: 8314774: Optimize URLEncoder [v6]
Claes Redestad
redestad at openjdk.org
Thu Aug 24 10:08:27 UTC 2023
On Thu, 24 Aug 2023 09:44:21 GMT, Daniel Fuchs <dfuchs at openjdk.org> wrote:
> I am not sure the added complexity is worth the gain. It's fine for String to have special knowledge of UTF-8 but I don't think we want that to bleed all over the place.
While I lean towards being wary, I think there are definitely things in here that is worth pursuing.
For example it seems profitable to avoid allocating and appending to a `StringBuilder` for the case where we end up returning the original `String`, so perhaps this would be better implemented using a fast-path loop:
```diff --git a/src/java.base/share/classes/java/net/URLEncoder.java b/src/java.base/share/classes/java/net/URLEncoder.java
index 1b5ff1cae26..e1ded633133 100644
--- a/src/java.base/share/classes/java/net/URLEncoder.java
+++ b/src/java.base/share/classes/java/net/URLEncoder.java
@@ -219,19 +219,28 @@ public static String encode(String s, String enc)
public static String encode(String s, Charset charset) {
Objects.requireNonNull(charset, "charset");
- boolean needToChange = false;
+ int i = 0;
+ while (i < s.length()) {
+ char c = s.charAt(i);
+ if (!DONT_NEED_ENCODING.get(c) || c == ' ') { // perhaps add another BitSet that has also has ' '
+ break;
+ } else {
+ i++;
+ }
+ }
+ if (i >= s.length()) {
+ return s;
+ }
StringBuilder out = new StringBuilder(s.length());
+ out.append(s, 0, i);
CharArrayWriter charArrayWriter = new CharArrayWriter();
- for (int i = 0; i < s.length();) {
+ while (i < s.length()) {
int c = s.charAt(i);
- //System.out.println("Examining character: " + c);
if (DONT_NEED_ENCODING.get(c)) {
if (c == ' ') {
c = '+';
- needToChange = true;
}
- //System.out.println("Storing: " + c);
out.append((char)c);
i++;
} else {
@@ -290,10 +299,9 @@ public static String encode(String s, Charset charset) {
out.append(ch);
}
charArrayWriter.reset();
- needToChange = true;
}
}
- return (needToChange? out.toString() : s);
+ return out.toString();
}
}
-------------
PR Comment: https://git.openjdk.org/jdk/pull/15354#issuecomment-1691390826
More information about the net-dev
mailing list