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());