This is an automated email from the ASF dual-hosted git repository.
albumenj pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/3.0 by this push:
new 335bf5a [3.0] Reduce object creation when getting extensions (#9218)
335bf5a is described below
commit 335bf5ae52ce08d89582b703c0e64a83778d4d4a
Author: Albumen Kevin <[email protected]>
AuthorDate: Sat Nov 6 15:35:17 2021 +0800
[3.0] Reduce object creation when getting extensions (#9218)
* [3.0] Reduce object creation when getting extensions
* fix ut
---
.../dubbo/common/extension/ExtensionDirector.java | 9 ++++--
.../dubbo/common/extension/ExtensionLoader.java | 32 ++++++++++++++++------
.../extension/support/ActivateComparator.java | 10 ++++++-
3 files changed, 39 insertions(+), 12 deletions(-)
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionDirector.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionDirector.java
index 0fd29a2..578fcf9 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionDirector.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionDirector.java
@@ -34,6 +34,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
public class ExtensionDirector implements ExtensionAccessor {
private final ConcurrentMap<Class<?>, ExtensionLoader<?>>
extensionLoadersMap = new ConcurrentHashMap<>(64);
+ private final ConcurrentMap<Class<?>, ExtensionScope> extensionScopeMap =
new ConcurrentHashMap<>(64);
private ExtensionDirector parent;
private final ExtensionScope scope;
private List<ExtensionPostProcessor> extensionPostProcessors = new
ArrayList<>();
@@ -78,8 +79,12 @@ public class ExtensionDirector implements ExtensionAccessor {
// 1. find in local cache
ExtensionLoader<T> loader = (ExtensionLoader<T>)
extensionLoadersMap.get(type);
- final SPI annotation = type.getAnnotation(SPI.class);
- ExtensionScope scope = annotation.scope();
+ ExtensionScope scope = extensionScopeMap.get(type);
+ if (scope == null) {
+ SPI annotation = type.getAnnotation(SPI.class);
+ scope = annotation.scope();
+ extensionScopeMap.put(type, scope);
+ }
if (loader == null && scope == ExtensionScope.SELF) {
// create an instance in self scope
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
index 3d2b06d..604ca14 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
@@ -113,7 +113,7 @@ public class ExtensionLoader<T> {
private final Map<String, Object> cachedActivates =
Collections.synchronizedMap(new LinkedHashMap<>());
private final Map<String, Set<String>> cachedActivateGroups =
Collections.synchronizedMap(new LinkedHashMap<>());
- private final Map<String, String[]> cachedActivateValues =
Collections.synchronizedMap(new LinkedHashMap<>());
+ private final Map<String, String[][]> cachedActivateValues =
Collections.synchronizedMap(new LinkedHashMap<>());
private final ConcurrentMap<String, Holder<Object>> cachedInstances = new
ConcurrentHashMap<>();
private final Holder<Object> cachedAdaptiveInstance = new Holder<>();
private volatile Class<?> cachedAdaptiveClass = null;
@@ -343,7 +343,19 @@ public class ExtensionLoader<T> {
continue;
}
cachedActivateGroups.put(name, new
HashSet<>(Arrays.asList(activateGroup)));
- cachedActivateValues.put(name, activateValue);
+ String[][] keyPairs = new
String[activateValue.length][];
+ for (int i = 0; i < activateValue.length; i++) {
+ if (activateValue[i].contains(":")) {
+ keyPairs[i] = new String[2];
+ String[] arr = activateValue[i].split(":");
+ keyPairs[i][0] = arr[0];
+ keyPairs[i][1] = arr[1];
+ } else {
+ keyPairs[i] = new String[1];
+ keyPairs[i][0] = activateValue[i];
+ }
+ }
+ cachedActivateValues.put(name, keyPairs);
}
}
}
@@ -426,17 +438,19 @@ public class ExtensionLoader<T> {
return false;
}
- private boolean isActive(String[] keys, URL url) {
- if (keys.length == 0) {
+ private boolean isActive(String[][] keyPairs, URL url) {
+ if (keyPairs.length == 0) {
return true;
}
- for (String key : keys) {
+ for (String[] keyPair : keyPairs) {
// @Active(value="key1:value1, key2:value2")
+ String key = null;
String keyValue = null;
- if (key.contains(":")) {
- String[] arr = key.split(":");
- key = arr[0];
- keyValue = arr[1];
+ if (keyPair.length > 1) {
+ key = keyPair[0];
+ keyValue = keyPair[1];
+ } else {
+ key = keyPair[0];
}
String realValue = url.getParameter(key);
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/support/ActivateComparator.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/support/ActivateComparator.java
index 675fa71..5c755ae 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/support/ActivateComparator.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/support/ActivateComparator.java
@@ -24,6 +24,8 @@ import org.apache.dubbo.common.utils.ArrayUtils;
import java.util.Arrays;
import java.util.Comparator;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
/**
* OrderComparator
@@ -31,6 +33,7 @@ import java.util.Comparator;
public class ActivateComparator implements Comparator<Class<?>> {
private ExtensionDirector extensionDirector;
+ private final Map<Class<?>, ActivateInfo> activateInfoMap = new
ConcurrentHashMap<>();
public ActivateComparator(ExtensionDirector extensionDirector) {
this.extensionDirector = extensionDirector;
@@ -115,7 +118,11 @@ public class ActivateComparator implements
Comparator<Class<?>> {
}
private ActivateInfo parseActivate(Class<?> clazz) {
- ActivateInfo info = new ActivateInfo();
+ ActivateInfo info = activateInfoMap.get(clazz);
+ if (info != null) {
+ return info;
+ }
+ info = new ActivateInfo();
if (clazz.isAnnotationPresent(Activate.class)) {
Activate activate = clazz.getAnnotation(Activate.class);
info.before = activate.before();
@@ -130,6 +137,7 @@ public class ActivateComparator implements
Comparator<Class<?>> {
} else {
info.order = 0;
}
+ activateInfoMap.put(clazz, info);
return info;
}