From cfc110916bd2c1a73bce2bbd1373f5d29b9190d0 Mon Sep 17 00:00:00 2001 From: bcluap Date: Tue, 28 Jul 2020 14:48:58 +0200 Subject: [PATCH] [RESTEASY-2659] Performance improvements (#2479) - Avoid unnecessary use of URI.create - rather do more lazily - Multivalued maps will 99% of the time have 1 or maybe 2 entries for a key so don't allocate memory for 10 - Avoid unnecessary matcher creation when decoding when a string does not contain % in it - which is the more likely case for URI's to Rest resources These changes increase throughput by about 2% on a simple Rest service. Co-authored-by: Paul Carter-Brown --- .../resteasy/specimpl/MultivaluedMapImpl.java | 4 +-- .../resteasy/specimpl/ResteasyUriInfo.java | 31 +++++++++---------- .../java/org/jboss/resteasy/util/Encode.java | 3 ++ 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/resteasy-core/src/main/java/org/jboss/resteasy/specimpl/MultivaluedMapImpl.java b/resteasy-core/src/main/java/org/jboss/resteasy/specimpl/MultivaluedMapImpl.java index 13a5401c6d9..8666ad0ddc1 100644 --- a/resteasy-core/src/main/java/org/jboss/resteasy/specimpl/MultivaluedMapImpl.java +++ b/resteasy-core/src/main/java/org/jboss/resteasy/specimpl/MultivaluedMapImpl.java @@ -16,7 +16,7 @@ public class MultivaluedMapImpl extends HashMap> implements Mul { public void putSingle(K key, V value) { - List list = new ArrayList(); + List list = new ArrayList(2); list.add(value); put(key, list); } @@ -75,7 +75,7 @@ public final List getList(K key) { List list = get(key); if (list == null) - put(key, list = new ArrayList()); + put(key, list = new ArrayList(2)); return list; } diff --git a/resteasy-core/src/main/java/org/jboss/resteasy/specimpl/ResteasyUriInfo.java b/resteasy-core/src/main/java/org/jboss/resteasy/specimpl/ResteasyUriInfo.java index 5c351770261..3fa28668da5 100644 --- a/resteasy-core/src/main/java/org/jboss/resteasy/specimpl/ResteasyUriInfo.java +++ b/resteasy-core/src/main/java/org/jboss/resteasy/specimpl/ResteasyUriInfo.java @@ -81,17 +81,6 @@ protected void initialize(String absoluteUri, String contextPath, InitData initD this.matchingPath = initData.getMatchingPath(); } - private void processUris() { - requestURI = URI.create(absoluteString); - absolutePath = queryIdx < 0 ? requestURI : URI.create(absoluteString.substring(0, queryIdx)); - baseURI = absolutePath; - String tmpContextPath = contextPath; - if (!tmpContextPath.endsWith("/")) tmpContextPath += "/"; - if (!tmpContextPath.startsWith("/")) tmpContextPath = "/" + tmpContextPath; - String baseString = absoluteString.substring(0, pathStart); - baseString += tmpContextPath; - baseURI = URI.create(baseString); - } protected void initialize(CharSequence absoluteUri, String queryString, String contextPath) { @@ -273,8 +262,7 @@ public String getMatchingPath() */ public void setRequestUri(URI relative) { - if (baseURI == null) processUris(); - setUri(baseURI, relative); + setUri(getBaseUri(), relative); } public String getPath() @@ -301,7 +289,9 @@ public List getPathSegments(boolean decode) public URI getRequestUri() { - if (requestURI == null) processUris(); + if (requestURI == null) { + requestURI = URI.create(absoluteString); + } return requestURI; } @@ -312,7 +302,9 @@ public UriBuilder getRequestUriBuilder() public URI getAbsolutePath() { - if (absolutePath == null) processUris(); + if (absolutePath == null) { + absolutePath = queryIdx < 0 ? getRequestUri() : URI.create(absoluteString.substring(0, queryIdx)); + } return absolutePath; } @@ -323,7 +315,14 @@ public UriBuilder getAbsolutePathBuilder() public URI getBaseUri() { - if (baseURI == null) processUris(); + if (baseURI == null) { + String tmpContextPath = contextPath; + if (!tmpContextPath.endsWith("/")) tmpContextPath += "/"; + if (!tmpContextPath.startsWith("/")) tmpContextPath = "/" + tmpContextPath; + String baseString = absoluteString.substring(0, pathStart); + baseString += tmpContextPath; + baseURI = URI.create(baseString); + } return baseURI; } diff --git a/resteasy-core/src/main/java/org/jboss/resteasy/util/Encode.java b/resteasy-core/src/main/java/org/jboss/resteasy/util/Encode.java index 243663b01b4..a91370ccf9b 100644 --- a/resteasy-core/src/main/java/org/jboss/resteasy/util/Encode.java +++ b/resteasy-core/src/main/java/org/jboss/resteasy/util/Encode.java @@ -214,6 +214,9 @@ public static String encodeQueryParam(String value) public static String decodePath(String path) { + if (path.indexOf('%') == -1) { + return path; + } Matcher matcher = encodedCharsMulti.matcher(path); int start=0; StringBuilder builder = new StringBuilder();