You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2019/12/20 09:41:21 UTC

[dubbo] branch master updated: [Dubbo-perf]: Reduce object allocation for URL.getAddress() (#5492)

This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/master by this push:
     new 0227fda  [Dubbo-perf]: Reduce object allocation for URL.getAddress() (#5492)
0227fda is described below

commit 0227fda49ae92a60a66a5f02dc915e32fcc0512f
Author: LinShunKang <li...@gmail.com>
AuthorDate: Fri Dec 20 17:41:07 2019 +0800

    [Dubbo-perf]: Reduce object allocation for URL.getAddress() (#5492)
---
 .../src/main/java/org/apache/dubbo/common/URL.java | 74 +++++++++++++---------
 .../test/java/org/apache/dubbo/common/URLTest.java | 39 ++++++++++++
 2 files changed, 83 insertions(+), 30 deletions(-)

diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java b/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java
index a7cd8d5..fe3274d 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java
@@ -130,12 +130,15 @@ class URL implements Serializable {
 
     private transient String serviceKey;
 
+    private transient String address;
+
     protected URL() {
         this.protocol = null;
         this.username = null;
         this.password = null;
         this.host = null;
         this.port = 0;
+        this.address = null;
         this.path = null;
         this.parameters = null;
         this.methodParameters = null;
@@ -180,7 +183,7 @@ class URL implements Serializable {
                int port,
                String path,
                Map<String, String> parameters) {
-        this (protocol, username, password, host, port, path, parameters, toMethodParameters(parameters));
+        this(protocol, username, password, host, port, path, parameters, toMethodParameters(parameters));
     }
 
     public URL(String protocol,
@@ -199,7 +202,9 @@ class URL implements Serializable {
         this.username = username;
         this.password = password;
         this.host = host;
-        this.port = (port < 0 ? 0 : port);
+        this.port = Math.max(port, 0);
+        this.address = getAddress(this.host, this.port);
+
         // trim the beginning "/"
         while (path != null && path.startsWith("/")) {
             path = path.substring(1);
@@ -214,6 +219,10 @@ class URL implements Serializable {
         this.methodParameters = Collections.unmodifiableMap(methodParameters);
     }
 
+    private static String getAddress(String host, int port) {
+        return port <= 0 ? host : host + ':' + port;
+    }
+
     /**
      * Parse url string
      *
@@ -304,31 +313,33 @@ class URL implements Serializable {
 
     public static Map<String, Map<String, String>> toMethodParameters(Map<String, String> parameters) {
         Map<String, Map<String, String>> methodParameters = new HashMap<>();
-        if (parameters != null) {
-            String methodsString = parameters.get(METHODS_KEY);
-            if (StringUtils.isNotEmpty(methodsString)) {
-                String[] methods = methodsString.split(",");
-                for (Map.Entry<String, String> entry : parameters.entrySet()) {
-                    String key = entry.getKey();
-                    for (String method : methods) {
-                        String methodPrefix = method + '.';
-                        if (key.startsWith(methodPrefix)) {
-                            String realKey = key.substring(methodPrefix.length());
-                            URL.putMethodParameter(method, realKey, entry.getValue(), methodParameters);
-                        }
-                    }
-                }
-            } else {
-                for (Map.Entry<String, String> entry : parameters.entrySet()) {
-                    String key = entry.getKey();
-                    int methodSeparator = key.indexOf('.');
-                    if (methodSeparator > 0) {
-                        String method = key.substring(0, methodSeparator);
-                        String realKey = key.substring(methodSeparator + 1);
+        if (parameters == null) {
+            return methodParameters;
+        }
+
+        String methodsString = parameters.get(METHODS_KEY);
+        if (StringUtils.isNotEmpty(methodsString)) {
+            String[] methods = methodsString.split(",");
+            for (Map.Entry<String, String> entry : parameters.entrySet()) {
+                String key = entry.getKey();
+                for (String method : methods) {
+                    String methodPrefix = method + '.';
+                    if (key.startsWith(methodPrefix)) {
+                        String realKey = key.substring(methodPrefix.length());
                         URL.putMethodParameter(method, realKey, entry.getValue(), methodParameters);
                     }
                 }
             }
+        } else {
+            for (Map.Entry<String, String> entry : parameters.entrySet()) {
+                String key = entry.getKey();
+                int methodSeparator = key.indexOf('.');
+                if (methodSeparator > 0) {
+                    String method = key.substring(0, methodSeparator);
+                    String realKey = key.substring(methodSeparator + 1);
+                    URL.putMethodParameter(method, realKey, entry.getValue(), methodParameters);
+                }
+            }
         }
         return methodParameters;
     }
@@ -477,7 +488,10 @@ class URL implements Serializable {
     }
 
     public String getAddress() {
-        return port <= 0 ? host : host + ":" + port;
+        if (address == null) {
+            address = getAddress(host, port);
+        }
+        return address;
     }
 
     public URL setAddress(String address) {
@@ -765,7 +779,7 @@ class URL implements Serializable {
         Map<String, String> keyMap = methodParameters.get(method);
         String value = null;
         if (keyMap != null) {
-            value =  keyMap.get(key);
+            value = keyMap.get(key);
         }
         if (StringUtils.isEmpty(value)) {
             value = parameters.get(key);
@@ -1570,7 +1584,7 @@ class URL implements Serializable {
             return false;
         }
         URL other = (URL) obj;
-        if(!StringUtils.isEquals(host, other.host)) {
+        if (!StringUtils.isEquals(host, other.host)) {
             return false;
         }
         if (parameters == null) {
@@ -1580,19 +1594,19 @@ class URL implements Serializable {
         } else if (!parameters.equals(other.parameters)) {
             return false;
         }
-        if(!StringUtils.isEquals(password, other.password)) {
+        if (!StringUtils.isEquals(password, other.password)) {
             return false;
         }
-        if(!StringUtils.isEquals(path, other.path)) {
+        if (!StringUtils.isEquals(path, other.path)) {
             return false;
         }
         if (port != other.port) {
             return false;
         }
-        if(!StringUtils.isEquals(protocol, other.protocol)) {
+        if (!StringUtils.isEquals(protocol, other.protocol)) {
             return false;
         }
-        if(!StringUtils.isEquals(username, other.username)) {
+        if (!StringUtils.isEquals(username, other.username)) {
             return false;
         }
         return true;
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/URLTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/URLTest.java
index 2f99f84..e1df876 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/URLTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/URLTest.java
@@ -44,6 +44,7 @@ public class URLTest {
         assertNull(url.getUsername());
         assertNull(url.getPassword());
         assertNull(url.getHost());
+        assertNull(url.getAddress());
         assertEquals(0, url.getPort());
         assertEquals("context/path", url.getPath());
         assertEquals(2, url.getParameters().size());
@@ -71,6 +72,7 @@ public class URLTest {
         assertNull(url.getUsername());
         assertNull(url.getPassword());
         assertEquals("10.20.130.230", url.getHost());
+        assertEquals("10.20.130.230", url.getAddress());
         assertEquals(0, url.getPort());
         assertNull(url.getPath());
         assertEquals(0, url.getParameters().size());
@@ -80,6 +82,7 @@ public class URLTest {
         assertNull(url.getUsername());
         assertNull(url.getPassword());
         assertEquals("10.20.130.230", url.getHost());
+        assertEquals("10.20.130.230:20880", url.getAddress());
         assertEquals(20880, url.getPort());
         assertNull(url.getPath());
         assertEquals(0, url.getParameters().size());
@@ -89,6 +92,7 @@ public class URLTest {
         assertNull(url.getUsername());
         assertNull(url.getPassword());
         assertEquals("10.20.130.230", url.getHost());
+        assertEquals("10.20.130.230", url.getAddress());
         assertEquals(0, url.getPort());
         assertEquals("context/path", url.getPath());
         assertEquals(0, url.getParameters().size());
@@ -98,6 +102,7 @@ public class URLTest {
         assertNull(url.getUsername());
         assertNull(url.getPassword());
         assertEquals("10.20.130.230", url.getHost());
+        assertEquals("10.20.130.230:20880", url.getAddress());
         assertEquals(20880, url.getPort());
         assertEquals("context/path", url.getPath());
         assertEquals(0, url.getParameters().size());
@@ -107,6 +112,7 @@ public class URLTest {
         assertEquals("admin", url.getUsername());
         assertEquals("hello1234", url.getPassword());
         assertEquals("10.20.130.230", url.getHost());
+        assertEquals("10.20.130.230:20880", url.getAddress());
         assertEquals(20880, url.getPort());
         assertEquals("context/path", url.getPath());
         assertEquals(2, url.getParameters().size());
@@ -121,6 +127,7 @@ public class URLTest {
         assertNull(url.getUsername());
         assertNull(url.getPassword());
         assertNull(url.getHost());
+        assertNull(url.getAddress());
         assertEquals(0, url.getPort());
         assertEquals("home/user1/router.js", url.getPath());
         assertEquals(0, url.getParameters().size());
@@ -142,6 +149,7 @@ public class URLTest {
         assertNull(url.getUsername());
         assertNull(url.getPassword());
         assertNull(url.getHost());
+        assertNull(url.getAddress());
         assertEquals(0, url.getPort());
         assertEquals("home/user1/router.js", url.getPath());
         assertEquals(0, url.getParameters().size());
@@ -151,6 +159,7 @@ public class URLTest {
         assertNull(url.getUsername());
         assertNull(url.getPassword());
         assertNull(url.getHost());
+        assertNull(url.getAddress());
         assertEquals(0, url.getPort());
         assertEquals("d:/home/user1/router.js", url.getPath());
         assertEquals(0, url.getParameters().size());
@@ -160,6 +169,7 @@ public class URLTest {
         assertNull(url.getUsername());
         assertNull(url.getPassword());
         assertNull(url.getHost());
+        assertNull(url.getAddress());
         assertEquals(0, url.getPort());
         assertEquals("home/user1/router.js", url.getPath());
         assertEquals(2, url.getParameters().size());
@@ -173,6 +183,7 @@ public class URLTest {
         assertNull(url.getUsername());
         assertNull(url.getPassword());
         assertNull(url.getHost());
+        assertNull(url.getAddress());
         assertEquals(0, url.getPort());
         assertEquals("home/user1/router.js", url.getPath());
         assertEquals(2, url.getParameters().size());
@@ -189,6 +200,7 @@ public class URLTest {
         assertNull(url.getUsername());
         assertNull(url.getPassword());
         assertEquals("10.20.130.230", url.getHost());
+        assertEquals("10.20.130.230", url.getAddress());
         assertEquals(0, url.getPort());
         assertNull(url.getPath());
         assertEquals(0, url.getParameters().size());
@@ -198,6 +210,7 @@ public class URLTest {
         assertNull(url.getUsername());
         assertNull(url.getPassword());
         assertEquals("10.20.130.230", url.getHost());
+        assertEquals("10.20.130.230:20880", url.getAddress());
         assertEquals(20880, url.getPort());
         assertEquals("context/path", url.getPath());
         assertEquals(0, url.getParameters().size());
@@ -207,6 +220,7 @@ public class URLTest {
         assertEquals("admin", url.getUsername());
         assertEquals("hello1234", url.getPassword());
         assertEquals("10.20.130.230", url.getHost());
+        assertEquals("10.20.130.230:20880", url.getAddress());
         assertEquals(20880, url.getPort());
         assertNull(url.getPath());
         assertEquals(0, url.getParameters().size());
@@ -216,6 +230,7 @@ public class URLTest {
         assertEquals("admin", url.getUsername());
         assertEquals("hello1234", url.getPassword());
         assertEquals("10.20.130.230", url.getHost());
+        assertEquals("10.20.130.230:20880", url.getAddress());
         assertEquals(20880, url.getPort());
         assertNull(url.getPath());
         assertEquals(1, url.getParameters().size());
@@ -226,6 +241,7 @@ public class URLTest {
         assertEquals("admin", url.getUsername());
         assertEquals("hello1234", url.getPassword());
         assertEquals("10.20.130.230", url.getHost());
+        assertEquals("10.20.130.230:20880", url.getAddress());
         assertEquals(20880, url.getPort());
         assertEquals("context/path", url.getPath());
         assertEquals(2, url.getParameters().size());
@@ -237,6 +253,7 @@ public class URLTest {
         assertEquals("admin", url.getUsername());
         assertEquals("hello1234", url.getPassword());
         assertEquals("10.20.130.230", url.getHost());
+        assertEquals("10.20.130.230:20880", url.getAddress());
         assertEquals(20880, url.getPort());
         assertEquals("context/path", url.getPath());
         assertEquals(3, url.getParameters().size());
@@ -328,6 +345,7 @@ public class URLTest {
         assertEquals("admin", url.getUsername());
         assertEquals("hello1234", url.getPassword());
         assertEquals("host", url.getHost());
+        assertEquals("host:20880", url.getAddress());
         assertEquals(20880, url.getPort());
         assertEquals("context/path", url.getPath());
         assertEquals(2, url.getParameters().size());
@@ -340,6 +358,7 @@ public class URLTest {
         assertEquals("admin", url.getUsername());
         assertEquals("hello1234", url.getPassword());
         assertEquals("host", url.getHost());
+        assertEquals("host:1", url.getAddress());
         assertEquals(1, url.getPort());
         assertEquals("context/path", url.getPath());
         assertEquals(2, url.getParameters().size());
@@ -352,6 +371,7 @@ public class URLTest {
         assertEquals("admin", url.getUsername());
         assertEquals("hello1234", url.getPassword());
         assertEquals("host", url.getHost());
+        assertEquals("host:1", url.getAddress());
         assertEquals(1, url.getPort());
         assertEquals("path", url.getPath());
         assertEquals(2, url.getParameters().size());
@@ -364,6 +384,7 @@ public class URLTest {
         assertEquals("admin", url.getUsername());
         assertEquals("hello1234", url.getPassword());
         assertEquals("host", url.getHost());
+        assertEquals("host:1", url.getAddress());
         assertEquals(1, url.getPort());
         assertEquals("path", url.getPath());
         assertEquals(2, url.getParameters().size());
@@ -376,6 +397,7 @@ public class URLTest {
         assertEquals("username", url.getUsername());
         assertEquals("hello1234", url.getPassword());
         assertEquals("host", url.getHost());
+        assertEquals("host:1", url.getAddress());
         assertEquals(1, url.getPort());
         assertEquals("path", url.getPath());
         assertEquals(2, url.getParameters().size());
@@ -388,6 +410,7 @@ public class URLTest {
         assertEquals("username", url.getUsername());
         assertEquals("password", url.getPassword());
         assertEquals("host", url.getHost());
+        assertEquals("host:1", url.getAddress());
         assertEquals(1, url.getPort());
         assertEquals("path", url.getPath());
         assertEquals(2, url.getParameters().size());
@@ -404,6 +427,7 @@ public class URLTest {
         assertEquals("admin", url.getUsername());
         assertEquals("hello1234", url.getPassword());
         assertEquals("10.20.130.230", url.getHost());
+        assertEquals("10.20.130.230:20880", url.getAddress());
         assertEquals(20880, url.getPort());
         assertEquals("context/path", url.getPath());
         assertEquals(3, url.getParameters().size());
@@ -418,6 +442,7 @@ public class URLTest {
         assertEquals("admin", url.getUsername());
         assertEquals("hello1234", url.getPassword());
         assertEquals("10.20.130.230", url.getHost());
+        assertEquals("10.20.130.230:20880", url.getAddress());
         assertEquals(20880, url.getPort());
         assertEquals("context/path", url.getPath());
         assertEquals(2, url.getParameters().size());
@@ -432,6 +457,7 @@ public class URLTest {
         assertEquals("admin", url.getUsername());
         assertEquals("hello1234", url.getPassword());
         assertEquals("10.20.130.230", url.getHost());
+        assertEquals("10.20.130.230:20880", url.getAddress());
         assertEquals(20880, url.getPort());
         assertEquals("context/path", url.getPath());
         assertEquals(2, url.getParameters().size());
@@ -450,6 +476,7 @@ public class URLTest {
         assertEquals("admin", url.getUsername());
         assertEquals("hello1234", url.getPassword());
         assertEquals("10.20.130.230", url.getHost());
+        assertEquals("10.20.130.230:20880", url.getAddress());
         assertEquals(20880, url.getPort());
         assertEquals("context/path", url.getPath());
         assertEquals(2, url.getParameters().size());
@@ -475,6 +502,7 @@ public class URLTest {
         assertEquals("admin", url.getUsername());
         assertEquals("hello1234", url.getPassword());
         assertEquals("10.20.130.230", url.getHost());
+        assertEquals("10.20.130.230:20880", url.getAddress());
         assertEquals(20880, url.getPort());
         assertEquals("context/path", url.getPath());
         assertEquals(3, url.getParameters().size());
@@ -489,6 +517,7 @@ public class URLTest {
         assertEquals("admin", url.getUsername());
         assertEquals("hello1234", url.getPassword());
         assertEquals("10.20.130.230", url.getHost());
+        assertEquals("10.20.130.230:20880", url.getAddress());
         assertEquals(20880, url.getPort());
         assertEquals("context/path", url.getPath());
         assertEquals(3, url.getParameters().size());
@@ -503,6 +532,7 @@ public class URLTest {
         assertEquals("admin", url.getUsername());
         assertEquals("hello1234", url.getPassword());
         assertEquals("10.20.130.230", url.getHost());
+        assertEquals("10.20.130.230:20880", url.getAddress());
         assertEquals(20880, url.getPort());
         assertEquals("context/path", url.getPath());
         assertEquals(3, url.getParameters().size());
@@ -517,6 +547,7 @@ public class URLTest {
         assertEquals("admin", url.getUsername());
         assertEquals("hello1234", url.getPassword());
         assertEquals("10.20.130.230", url.getHost());
+        assertEquals("10.20.130.230:20880", url.getAddress());
         assertEquals(20880, url.getPort());
         assertEquals("context/path", url.getPath());
         assertEquals(2, url.getParameters().size());
@@ -530,6 +561,7 @@ public class URLTest {
         assertEquals("admin", url.getUsername());
         assertEquals("hello1234", url.getPassword());
         assertEquals("10.20.130.230", url.getHost());
+        assertEquals("10.20.130.230:20880", url.getAddress());
         assertEquals(20880, url.getPort());
         assertEquals("context/path", url.getPath());
         assertEquals(1, url.getParameters().size());
@@ -561,6 +593,7 @@ public class URLTest {
         assertEquals("admin", url.getUsername());
         assertEquals("hello1234", url.getPassword());
         assertEquals("10.20.130.230", url.getHost());
+        assertEquals("10.20.130.230:20880", url.getAddress());
         assertEquals(20880, url.getPort());
         assertEquals("context/path", url.getPath());
         assertEquals(1, url.getParameters().size());
@@ -614,14 +647,17 @@ public class URLTest {
     public void test_Localhost() throws Exception {
         URL url = URL.valueOf("dubbo://127.0.0.1:20880");
         assertEquals("127.0.0.1", url.getHost());
+        assertEquals("127.0.0.1:20880", url.getAddress());
         assertTrue(url.isLocalHost());
 
         url = URL.valueOf("dubbo://127.0.1.1:20880");
         assertEquals("127.0.1.1", url.getHost());
+        assertEquals("127.0.1.1:20880", url.getAddress());
         assertTrue(url.isLocalHost());
 
         url = URL.valueOf("dubbo://localhost:20880");
         assertEquals("localhost", url.getHost());
+        assertEquals("localhost:20880", url.getAddress());
         assertTrue(url.isLocalHost());
     }
 
@@ -647,6 +683,7 @@ public class URLTest {
         assertEquals("ad@min", url.getUsername());
         assertEquals("hello@1234", url.getPassword());
         assertEquals("10.20.130.230", url.getHost());
+        assertEquals("10.20.130.230:20880", url.getAddress());
         assertEquals(20880, url.getPort());
         assertEquals("context/path", url.getPath());
         assertEquals(2, url.getParameters().size());
@@ -663,6 +700,7 @@ public class URLTest {
         assertEquals("ad@min111", url.getUsername());
         assertEquals("haha@1234", url.getPassword());
         assertEquals("2001:0db8:85a3:08d3:1319:8a2e:0370:7344", url.getHost());
+        assertEquals("2001:0db8:85a3:08d3:1319:8a2e:0370:7344:20880", url.getAddress());
         assertEquals(20880, url.getPort());
         assertEquals("context/path", url.getPath());
         assertEquals(2, url.getParameters().size());
@@ -675,6 +713,7 @@ public class URLTest {
         URL url = URL.valueOf("2001:0db8:85a3:08d3:1319:8a2e:0370:7344%5/context/path?version=1.0.0&application=morgan");
         assertNull(url.getProtocol());
         assertEquals("2001:0db8:85a3:08d3:1319:8a2e:0370:7344%5", url.getHost());
+        assertEquals("2001:0db8:85a3:08d3:1319:8a2e:0370:7344%5", url.getAddress());
         assertEquals(0, url.getPort());
         assertEquals("context/path", url.getPath());
         assertEquals(2, url.getParameters().size());