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;
     }
 

Reply via email to