You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2016/09/15 19:48:50 UTC

[1/5] tinkerpop git commit: JavaTranslator now makes use of a static method cache. This speeds up Bytecode->JavaTranslator translation. From 0.098ms to 0.029ms. If a GremlinServer Bytecode cache is not desired, then, at minimum we should use this JavaTra

Repository: tinkerpop
Updated Branches:
  refs/heads/master 3a4f70510 -> 0ee005b62


JavaTranslator now makes use of a static method cache. This speeds up Bytecode->JavaTranslator translation. From 0.098ms to 0.029ms. If a GremlinServer Bytecode cache is not desired, then, at minimum we should use this JavaTranslator update in its place.


Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/2a2b59b1
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/2a2b59b1
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/2a2b59b1

Branch: refs/heads/master
Commit: 2a2b59b15833d80587bb8127d6edfd38a17ab788
Parents: 13782aa
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Sep 13 13:23:32 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Sep 13 13:23:32 2016 -0600

----------------------------------------------------------------------
 .../tinkerpop/gremlin/jsr223/JavaTranslator.java | 19 +++++++++++++++----
 .../structure/TinkerGraphPlayTest.java           |  2 +-
 2 files changed, 16 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/2a2b59b1/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java
index dac6583..d00ad1c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java
@@ -33,6 +33,7 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -41,12 +42,11 @@ public final class JavaTranslator<S extends TraversalSource, T extends Traversal
 
     private final S traversalSource;
     private final Class anonymousTraversal;
-    private final Map<String, List<Method>> traversalSourceMethodCache = new HashMap<>();
-    private final Map<String, List<Method>> traversalMethodCache = new HashMap<>();
+    private static final Map<Class<? extends TraversalSource>, Map<String, List<Method>>> TRAVERSAL_SOURCE_METHOD_CACHE = new ConcurrentHashMap<>();
+    private static final Map<Class<? extends Traversal>, Map<String, List<Method>>> TRAVERSAL_METHOD_CACHE = new ConcurrentHashMap<>();
 
     private JavaTranslator(final S traversalSource) {
         this.traversalSource = traversalSource;
-        // todo: could produce an NPE later on. need a good model for when a traversal species doesn't support nesting.
         this.anonymousTraversal = traversalSource.getAnonymousTraversalClass().orElse(null);
     }
 
@@ -102,8 +102,12 @@ public final class JavaTranslator<S extends TraversalSource, T extends Traversal
     }
 
     private Object invokeMethod(final Object delegate, final Class returnType, final String methodName, final Object... arguments) {
+        //////////////////////////
+        //////////////////////////
         // populate method cache for fast access to methods in subsequent calls
-        final Map<String, List<Method>> methodCache = delegate instanceof TraversalSource ? this.traversalSourceMethodCache : this.traversalMethodCache;
+        final Map<String, List<Method>> methodCache = delegate instanceof TraversalSource ?
+                this.TRAVERSAL_SOURCE_METHOD_CACHE.getOrDefault(delegate.getClass(), new HashMap<>()) :
+                this.TRAVERSAL_METHOD_CACHE.getOrDefault(delegate.getClass(), new HashMap<>());
         if (methodCache.isEmpty()) {
             for (final Method method : delegate.getClass().getMethods()) {
                 if (!(method.getName().equals("addV") && method.getParameterCount() == 1 && method.getParameters()[0].getType().equals(Object[].class))) { // hack cause its hard to tell Object[] vs. String :|
@@ -115,7 +119,14 @@ public final class JavaTranslator<S extends TraversalSource, T extends Traversal
                     list.add(method);
                 }
             }
+            if (delegate instanceof TraversalSource)
+                TRAVERSAL_SOURCE_METHOD_CACHE.put((Class<TraversalSource>) delegate.getClass(), methodCache);
+            else
+                TRAVERSAL_METHOD_CACHE.put((Class<Traversal>) delegate.getClass(), methodCache);
         }
+        //////////////////////////
+        //////////////////////////
+
         // create a copy of the argument array so as not to mutate the original bytecode
         final Object[] argumentsCopy = new Object[arguments.length];
         for (int i = 0; i < arguments.length; i++) {

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/2a2b59b1/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
index 94fd250..37187fe 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
@@ -77,7 +77,7 @@ public class TinkerGraphPlayTest {
 
         final Traversal<?, ?> traversal = g.V().repeat(out()).times(2).groupCount().by("name").select(Column.keys).order().by(Order.decr);
         final Bytecode bytecode = traversal.asAdmin().getBytecode();
-
+        //final JavaTranslator translator = JavaTranslator.of(g);
         final Map<Bytecode, Traversal.Admin<?, ?>> cache = new HashMap<>();
         cache.put(bytecode, traversal.asAdmin());
         final HashSet<?> result = new LinkedHashSet<>(Arrays.asList("ripple", "lop"));


[5/5] tinkerpop git commit: Merge branch 'TINKERPOP-1444'

Posted by ok...@apache.org.
Merge branch 'TINKERPOP-1444'


Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/0ee005b6
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/0ee005b6
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/0ee005b6

Branch: refs/heads/master
Commit: 0ee005b623785d78c31840327fd61f5e13612550
Parents: 3a4f705 c47217d
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Sep 15 13:45:49 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Sep 15 13:45:49 2016 -0600

----------------------------------------------------------------------
 .../gremlin/jsr223/JavaTranslator.java          | 40 +++++++++++---------
 .../structure/TinkerGraphPlayTest.java          |  2 +-
 2 files changed, 24 insertions(+), 18 deletions(-)
----------------------------------------------------------------------



[2/5] tinkerpop git commit: removed this. from a static field name call. minor nothing.

Posted by ok...@apache.org.
removed this. from a static field name call. minor nothing.


Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/ed8feea5
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/ed8feea5
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/ed8feea5

Branch: refs/heads/master
Commit: ed8feea52e2055edcd45cd5c97f8ef3d60cc6820
Parents: 2a2b59b
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Sep 13 13:30:27 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Sep 13 13:30:27 2016 -0600

----------------------------------------------------------------------
 .../java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/ed8feea5/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java
index d00ad1c..a4f97a1 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java
@@ -106,8 +106,8 @@ public final class JavaTranslator<S extends TraversalSource, T extends Traversal
         //////////////////////////
         // populate method cache for fast access to methods in subsequent calls
         final Map<String, List<Method>> methodCache = delegate instanceof TraversalSource ?
-                this.TRAVERSAL_SOURCE_METHOD_CACHE.getOrDefault(delegate.getClass(), new HashMap<>()) :
-                this.TRAVERSAL_METHOD_CACHE.getOrDefault(delegate.getClass(), new HashMap<>());
+                TRAVERSAL_SOURCE_METHOD_CACHE.getOrDefault(delegate.getClass(), new HashMap<>()) :
+                TRAVERSAL_METHOD_CACHE.getOrDefault(delegate.getClass(), new HashMap<>());
         if (methodCache.isEmpty()) {
             for (final Method method : delegate.getClass().getMethods()) {
                 if (!(method.getName().equals("addV") && method.getParameterCount() == 1 && method.getParameters()[0].getType().equals(Object[].class))) { // hack cause its hard to tell Object[] vs. String :|


[4/5] tinkerpop git commit: Improved thread safety when building the method cache in JavaTranslator

Posted by ok...@apache.org.
Improved thread safety when building the method cache in JavaTranslator


Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/c47217d2
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/c47217d2
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/c47217d2

Branch: refs/heads/master
Commit: c47217d26336ff68dc8dbb9a028664cb80bdaf42
Parents: 1fc52cb
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Sep 15 15:42:12 2016 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Sep 15 15:42:12 2016 -0400

----------------------------------------------------------------------
 .../gremlin/jsr223/JavaTranslator.java          | 34 ++++++++++----------
 1 file changed, 17 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c47217d2/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java
index ed2def2..5d3e82d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java
@@ -102,25 +102,9 @@ public final class JavaTranslator<S extends TraversalSource, T extends Traversal
     }
 
     private Object invokeMethod(final Object delegate, final Class returnType, final String methodName, final Object... arguments) {
-        //////////////////////////
-        //////////////////////////
         // populate method cache for fast access to methods in subsequent calls
         final Map<String, List<Method>> methodCache = GLOBAL_METHOD_CACHE.getOrDefault(delegate.getClass(), new HashMap<>());
-        if (methodCache.isEmpty()) {
-            for (final Method method : delegate.getClass().getMethods()) {
-                if (!(method.getName().equals("addV") && method.getParameterCount() == 1 && method.getParameters()[0].getType().equals(Object[].class))) { // hack cause its hard to tell Object[] vs. String :|
-                    List<Method> list = methodCache.get(method.getName());
-                    if (null == list) {
-                        list = new ArrayList<>();
-                        methodCache.put(method.getName(), list);
-                    }
-                    list.add(method);
-                }
-            }
-            GLOBAL_METHOD_CACHE.put(delegate.getClass(), methodCache);
-        }
-        //////////////////////////
-        //////////////////////////
+        if (methodCache.isEmpty()) buildMethodCache(delegate, methodCache);
 
         // create a copy of the argument array so as not to mutate the original bytecode
         final Object[] argumentsCopy = new Object[arguments.length];
@@ -179,4 +163,20 @@ public final class JavaTranslator<S extends TraversalSource, T extends Traversal
         }
         throw new IllegalStateException("Could not locate method: " + delegate.getClass().getSimpleName() + "." + methodName + "(" + Arrays.toString(argumentsCopy) + ")");
     }
+
+    private synchronized static void buildMethodCache(final Object delegate, final Map<String, List<Method>> methodCache) {
+        if (methodCache.isEmpty()) {
+            for (final Method method : delegate.getClass().getMethods()) {
+                if (!(method.getName().equals("addV") && method.getParameterCount() == 1 && method.getParameters()[0].getType().equals(Object[].class))) { // hack cause its hard to tell Object[] vs. String :|
+                    List<Method> list = methodCache.get(method.getName());
+                    if (null == list) {
+                        list = new ArrayList<>();
+                        methodCache.put(method.getName(), list);
+                    }
+                    list.add(method);
+                }
+            }
+            GLOBAL_METHOD_CACHE.put(delegate.getClass(), methodCache);
+        }
+    }
 }


[3/5] tinkerpop git commit: reduced complexity by having a single GLOBAL_METHOD_CACHE for both Traversal and TraversalSource methods. Cleaner code with less instanceof stuff.

Posted by ok...@apache.org.
reduced complexity by having a single GLOBAL_METHOD_CACHE for both Traversal and TraversalSource methods. Cleaner code with less instanceof stuff.


Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/1fc52cb2
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/1fc52cb2
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/1fc52cb2

Branch: refs/heads/master
Commit: 1fc52cb2d208fb0949e66f2e1cf2c1307495a537
Parents: ed8feea
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Sep 13 13:34:47 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Sep 13 13:34:47 2016 -0600

----------------------------------------------------------------------
 .../tinkerpop/gremlin/jsr223/JavaTranslator.java     | 15 +++++----------
 1 file changed, 5 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/1fc52cb2/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java
index a4f97a1..ed2def2 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java
@@ -42,8 +42,8 @@ public final class JavaTranslator<S extends TraversalSource, T extends Traversal
 
     private final S traversalSource;
     private final Class anonymousTraversal;
-    private static final Map<Class<? extends TraversalSource>, Map<String, List<Method>>> TRAVERSAL_SOURCE_METHOD_CACHE = new ConcurrentHashMap<>();
-    private static final Map<Class<? extends Traversal>, Map<String, List<Method>>> TRAVERSAL_METHOD_CACHE = new ConcurrentHashMap<>();
+    private static final Map<Class<?>, Map<String, List<Method>>> GLOBAL_METHOD_CACHE = new ConcurrentHashMap<>();
+
 
     private JavaTranslator(final S traversalSource) {
         this.traversalSource = traversalSource;
@@ -105,9 +105,7 @@ public final class JavaTranslator<S extends TraversalSource, T extends Traversal
         //////////////////////////
         //////////////////////////
         // populate method cache for fast access to methods in subsequent calls
-        final Map<String, List<Method>> methodCache = delegate instanceof TraversalSource ?
-                TRAVERSAL_SOURCE_METHOD_CACHE.getOrDefault(delegate.getClass(), new HashMap<>()) :
-                TRAVERSAL_METHOD_CACHE.getOrDefault(delegate.getClass(), new HashMap<>());
+        final Map<String, List<Method>> methodCache = GLOBAL_METHOD_CACHE.getOrDefault(delegate.getClass(), new HashMap<>());
         if (methodCache.isEmpty()) {
             for (final Method method : delegate.getClass().getMethods()) {
                 if (!(method.getName().equals("addV") && method.getParameterCount() == 1 && method.getParameters()[0].getType().equals(Object[].class))) { // hack cause its hard to tell Object[] vs. String :|
@@ -119,10 +117,7 @@ public final class JavaTranslator<S extends TraversalSource, T extends Traversal
                     list.add(method);
                 }
             }
-            if (delegate instanceof TraversalSource)
-                TRAVERSAL_SOURCE_METHOD_CACHE.put((Class<TraversalSource>) delegate.getClass(), methodCache);
-            else
-                TRAVERSAL_METHOD_CACHE.put((Class<Traversal>) delegate.getClass(), methodCache);
+            GLOBAL_METHOD_CACHE.put(delegate.getClass(), methodCache);
         }
         //////////////////////////
         //////////////////////////
@@ -133,7 +128,7 @@ public final class JavaTranslator<S extends TraversalSource, T extends Traversal
             if (arguments[i] instanceof Bytecode.Binding)
                 argumentsCopy[i] = ((Bytecode.Binding) arguments[i]).value();
             else if (arguments[i] instanceof Bytecode)
-                argumentsCopy[i] = translateFromAnonymous((Bytecode) arguments[i]);
+                argumentsCopy[i] = this.translateFromAnonymous((Bytecode) arguments[i]);
             else
                 argumentsCopy[i] = arguments[i];
         }