# ignite-47 Store GridResourceField and GridResourceMethod to arrays instead of 
List (performance optimization)
(cherry picked from commit 1107e4b)


Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/573b658d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/573b658d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/573b658d

Branch: refs/heads/ignite-422
Commit: 573b658d598d588424fabc80578a4ae4325c9c34
Parents: 2d1b861
Author: sevdokimov <sevdoki...@gridgain.com>
Authored: Sat Mar 7 15:41:21 2015 +0300
Committer: sevdokimov <sevdoki...@gridgain.com>
Committed: Wed Mar 11 18:17:39 2015 +0300

----------------------------------------------------------------------
 .../processors/resource/GridResourceField.java  |  3 +
 .../processors/resource/GridResourceIoc.java    | 64 +++++++++++---------
 .../processors/resource/GridResourceMethod.java |  3 +
 .../resource/GridResourceProcessor.java         | 55 ++++-------------
 4 files changed, 54 insertions(+), 71 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/573b658d/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceField.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceField.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceField.java
index b36978f..04f750f 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceField.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceField.java
@@ -27,6 +27,9 @@ import java.lang.reflect.*;
  * Bean contains {@link Field} and {@link Annotation} for that class field.
  */
 class GridResourceField {
+    /** */
+    static final GridResourceField[] EMPTY_ARRAY = new GridResourceField[0];
+
     /** Field where resource should be injected. */
     private final Field field;
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/573b658d/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceIoc.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceIoc.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceIoc.java
index 03d81f8..1ebe2f5 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceIoc.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceIoc.java
@@ -39,13 +39,11 @@ class GridResourceIoc {
         new ConcurrentHashMap8<>();
 
     /** Field cache. */
-    private final ConcurrentMap<Class<?>, ConcurrentMap<Class<? extends 
Annotation>,
-        List<GridResourceField>>> fieldCache =
+    private final ConcurrentMap<Class<?>, ConcurrentMap<Class<? extends 
Annotation>, GridResourceField[]>> fieldCache =
         new ConcurrentHashMap8<>();
 
     /** Method cache. */
-    private final ConcurrentMap<Class<?>, ConcurrentMap<Class<? extends 
Annotation>,
-        List<GridResourceMethod>>> mtdCache =
+    private final ConcurrentMap<Class<?>, ConcurrentMap<Class<? extends 
Annotation>, GridResourceMethod[]>> mtdCache =
         new ConcurrentHashMap8<>();
 
     /**
@@ -152,11 +150,9 @@ class GridResourceIoc {
             return false;
 
         // Check if already inspected to avoid indefinite recursion.
-        if (checkedObjs.contains(target))
+        if (!checkedObjs.add(target))
             return false;
 
-        checkedObjs.add(target);
-
         int annCnt = 0;
 
         boolean injected = false;
@@ -230,14 +226,14 @@ class GridResourceIoc {
         if (skipClss != null && skipClss.contains(targetCls))
             return false;
 
-        List<GridResourceField> fields = getFieldsWithAnnotation(dep, 
targetCls, annCls);
+        GridResourceField[] fields = getFieldsWithAnnotation(dep, targetCls, 
annCls);
 
-        if (!fields.isEmpty())
+        if (fields.length > 0)
             return true;
 
-        List<GridResourceMethod> mtds = getMethodsWithAnnotation(dep, 
targetCls, annCls);
+        GridResourceMethod[] mtds = getMethodsWithAnnotation(dep, targetCls, 
annCls);
 
-        if (mtds.isEmpty()) {
+        if (mtds.length == 0) {
             if (skipClss == null)
                 skipClss = F.addIfAbsent(skipCache, annCls, 
F.<Class<?>>newCSet());
 
@@ -323,22 +319,27 @@ class GridResourceIoc {
      * @param annCls Annotation.
      * @return Set of methods with given annotations.
      */
-    List<GridResourceMethod> getMethodsWithAnnotation(@Nullable GridDeployment 
dep, Class<?> cls,
+    GridResourceMethod[] getMethodsWithAnnotation(@Nullable GridDeployment 
dep, Class<?> cls,
         Class<? extends Annotation> annCls) {
-        List<GridResourceMethod> mtds = getMethodsFromCache(cls, annCls);
+        GridResourceMethod[] mtds = getMethodsFromCache(cls, annCls);
 
         if (mtds == null) {
-            mtds = new ArrayList<>();
+            List<GridResourceMethod> mtdsList = new ArrayList<>();
 
             for (Class cls0 = cls; !cls0.equals(Object.class); cls0 = 
cls0.getSuperclass()) {
                 for (Method mtd : cls0.getDeclaredMethods()) {
                     Annotation ann = mtd.getAnnotation(annCls);
 
                     if (ann != null)
-                        mtds.add(new GridResourceMethod(mtd, ann));
+                        mtdsList.add(new GridResourceMethod(mtd, ann));
                 }
             }
 
+            if (mtdsList.isEmpty())
+                mtds = GridResourceMethod.EMPTY_ARRAY;
+            else
+                mtds = mtdsList.toArray(new 
GridResourceMethod[mtdsList.size()]);
+
             cacheMethods(dep, cls, annCls, mtds);
         }
 
@@ -354,12 +355,12 @@ class GridResourceIoc {
      * @param annCls Annotation.
      * @return Set of entries with given annotations.
      */
-    private List<GridResourceField> getFieldsWithAnnotation(@Nullable 
GridDeployment dep, Class<?> cls,
+    private GridResourceField[] getFieldsWithAnnotation(@Nullable 
GridDeployment dep, Class<?> cls,
         Class<? extends Annotation> annCls) {
-        List<GridResourceField> fields = getFieldsFromCache(cls, annCls);
+        GridResourceField[] fields = getFieldsFromCache(cls, annCls);
 
         if (fields == null) {
-            fields = new ArrayList<>();
+            List<GridResourceField> fieldsList = new ArrayList<>();
 
             for (Class cls0 = cls; !cls0.equals(Object.class); cls0 = 
cls0.getSuperclass()) {
                 for (Field field : cls0.getDeclaredFields()) {
@@ -367,10 +368,15 @@ class GridResourceIoc {
 
                     if (ann != null || 
GridResourceUtils.mayRequireResources(field))
                         // Account for anonymous inner classes.
-                        fields.add(new GridResourceField(field, ann));
+                        fieldsList.add(new GridResourceField(field, ann));
                 }
             }
 
+            if (fieldsList.isEmpty())
+                fields = GridResourceField.EMPTY_ARRAY;
+            else
+                fields = fieldsList.toArray(new 
GridResourceField[fieldsList.size()]);
+
             cacheFields(dep, cls, annCls, fields);
         }
 
@@ -384,8 +390,8 @@ class GridResourceIoc {
      * @param annCls Annotation class for fields.
      * @return List of fields with given annotation, possibly {@code null}.
      */
-    @Nullable private List<GridResourceField> getFieldsFromCache(Class<?> cls, 
Class<? extends Annotation> annCls) {
-        Map<Class<? extends Annotation>, List<GridResourceField>> annCache = 
fieldCache.get(cls);
+    @Nullable private GridResourceField[] getFieldsFromCache(Class<?> cls, 
Class<? extends Annotation> annCls) {
+        Map<Class<? extends Annotation>, GridResourceField[]> annCache = 
fieldCache.get(cls);
 
         return annCache != null ? annCache.get(annCls) : null;
     }
@@ -399,7 +405,7 @@ class GridResourceIoc {
      * @param fields Fields to cache.
      */
     private void cacheFields(@Nullable GridDeployment dep, Class<?> cls, 
Class<? extends Annotation> annCls,
-        List<GridResourceField> fields) {
+        GridResourceField[] fields) {
         if (dep != null) {
             Set<Class<?>> classes = F.addIfAbsent(taskMap, dep.classLoader(), 
F.<Class<?>>newCSet());
 
@@ -408,8 +414,8 @@ class GridResourceIoc {
             classes.add(cls);
         }
 
-        Map<Class<? extends Annotation>, List<GridResourceField>> rsrcFields =
-            F.addIfAbsent(fieldCache, cls, F.<Class<? extends Annotation>, 
List<GridResourceField>>newCMap());
+        Map<Class<? extends Annotation>, GridResourceField[]> rsrcFields =
+            F.addIfAbsent(fieldCache, cls, F.<Class<? extends Annotation>, 
GridResourceField[]>newCMap());
 
         assert rsrcFields != null;
 
@@ -423,8 +429,8 @@ class GridResourceIoc {
      * @param annCls Annotation class for fields.
      * @return List of methods with given annotation, possibly {@code null}.
      */
-    @Nullable private List<GridResourceMethod> getMethodsFromCache(Class<?> 
cls, Class<? extends Annotation> annCls) {
-        Map<Class<? extends Annotation>, List<GridResourceMethod>> annCache = 
mtdCache.get(cls);
+    @Nullable private GridResourceMethod[] getMethodsFromCache(Class<?> cls, 
Class<? extends Annotation> annCls) {
+        Map<Class<? extends Annotation>, GridResourceMethod[]> annCache = 
mtdCache.get(cls);
 
         return annCache != null ? annCache.get(annCls) : null;
     }
@@ -438,7 +444,7 @@ class GridResourceIoc {
      * @param mtds Methods to cache.
      */
     private void cacheMethods(@Nullable GridDeployment dep, Class<?> rsrcCls, 
Class<? extends Annotation> annCls,
-        List<GridResourceMethod> mtds) {
+        GridResourceMethod[] mtds) {
         if (dep != null) {
             Set<Class<?>> classes = F.addIfAbsent(taskMap, dep.classLoader(), 
F.<Class<?>>newCSet());
 
@@ -447,8 +453,8 @@ class GridResourceIoc {
             classes.add(rsrcCls);
         }
 
-        Map<Class<? extends Annotation>, List<GridResourceMethod>> rsrcMtds = 
F.addIfAbsent(mtdCache,
-            rsrcCls, F.<Class<? extends Annotation>, 
List<GridResourceMethod>>newCMap());
+        Map<Class<? extends Annotation>, GridResourceMethod[]> rsrcMtds = 
F.addIfAbsent(mtdCache,
+            rsrcCls, F.<Class<? extends Annotation>, 
GridResourceMethod[]>newCMap());
 
         assert rsrcMtds != null;
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/573b658d/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceMethod.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceMethod.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceMethod.java
index 3853c95..aba9405 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceMethod.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceMethod.java
@@ -27,6 +27,9 @@ import java.lang.reflect.*;
  * Bean contains {@link Method} and {@link Annotation} for that method.
  */
 class GridResourceMethod {
+    /** */
+    static final GridResourceMethod[] EMPTY_ARRAY = new GridResourceMethod[0];
+
     /** Method which used to inject resource. */
     private final Method mtd;
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/573b658d/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceProcessor.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceProcessor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceProcessor.java
index 8726536..f08a287 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceProcessor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceProcessor.java
@@ -141,19 +141,19 @@ public class GridResourceProcessor extends 
GridProcessorAdapter {
     public void invokeAnnotated(GridDeployment dep, Object target, Class<? 
extends Annotation> annCls)
         throws IgniteCheckedException {
         if (target != null) {
-            Collection<Method> mtds = getMethodsWithAnnotation(dep, 
target.getClass(), annCls);
-
-            if (mtds != null) {
-                for (Method mtd : mtds) {
-                    try {
-                        mtd.setAccessible(true);
-
-                        mtd.invoke(target);
-                    }
-                    catch (IllegalArgumentException | 
InvocationTargetException | IllegalAccessException e) {
-                        throw new IgniteCheckedException("Failed to invoke 
annotated method [job=" + target + ", mtd=" + mtd +
-                            ", ann=" + annCls + ']', e);
-                    }
+            GridResourceMethod[] rsrcMtds = ioc.getMethodsWithAnnotation(dep, 
target.getClass(), annCls);
+
+            for (GridResourceMethod rsrcMtd : rsrcMtds) {
+                Method mtd = rsrcMtd.getMethod();
+
+                try {
+                    mtd.setAccessible(true);
+
+                    mtd.invoke(target);
+                }
+                catch (IllegalArgumentException | InvocationTargetException | 
IllegalAccessException e) {
+                    throw new IgniteCheckedException("Failed to invoke 
annotated method [job=" + target + ", mtd=" + mtd +
+                        ", ann=" + annCls + ']', e);
                 }
             }
         }
@@ -570,35 +570,6 @@ public class GridResourceProcessor extends 
GridProcessorAdapter {
     }
 
     /**
-     * Gets list of methods in specified class annotated with specified 
annotation.
-     *
-     * @param dep Class deployment.
-     * @param rsrcCls Class to find methods in.
-     * @param annCls Annotation to find annotated methods with.
-     * @return List of annotated methods.
-     */
-    @Nullable public Collection<Method> 
getMethodsWithAnnotation(GridDeployment dep, Class<?> rsrcCls,
-        Class<? extends Annotation> annCls) {
-        assert dep != null;
-        assert rsrcCls != null;
-        assert annCls != null;
-
-        List<GridResourceMethod> mtds = ioc.getMethodsWithAnnotation(dep, 
rsrcCls, annCls);
-
-        assert mtds != null;
-
-        if (!mtds.isEmpty()) {
-            return F.viewReadOnly(mtds, new C1<GridResourceMethod, Method>() {
-                @Override public Method apply(GridResourceMethod rsrcMtd) {
-                    return rsrcMtd.getMethod();
-                }
-            });
-        }
-
-        return null;
-    }
-
-    /**
      * Returns GridResourceIoc object. For tests only!!!
      *
      * @return GridResourceIoc object.

Reply via email to