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