It would be good to understand when each is used. My assumptions:

REST:  Groovy
Client.submit(String): Groovy
Client.submit(Traversal): Java
Client.submit(Bytecode): Java
traversal().withRemote(DriverRemoteConnection): Java

??


On Wed, Sep 28, 2016 at 10:55 AM, Marko Rodriguez <okramma...@gmail.com> wrote:
> Hello,
>
> Gremlin bytecode provides a language agnostic way of sending Gremlin
> traversals between machines — whether physical or virtual. For instance, it
> is possible to send bytecode from one JVM to another or from CPython to the
> JVM across the network. Once bytecode is received, it needs to be translated
> into a representation that the processing VM can then evaluate.
>
> GremlinServer is smart in that when bytecode is received it will analyze it
> for lambdas. If there are lambdas, written in language X, then it will use
> XTranslator and XScriptEngine to evaluate the bytecode and create a
> Traversal for evaluation. However, if there are no lambdas, then it will use
> JavaTranslator to create a Traversal for evaluation.
>
> So, the question for me is:
>
> Is JavaTranslator (which uses Java reflection to convert bytecode to
> Traversal) faster than GroovyTranslator/GroovyScriptEngine (which creates a
> String script for and evaluates it in the ScriptEngine)?
>
> Lets see. Here is our script in total.
>
> import org.apache.tinkerpop.gremlin.jsr223.JavaTranslator
> import org.apache.tinkerpop.gremlin.groovy.jsr223.GroovyTranslator
>
> //// EXECUTED LOCALLY (e.g. CLIENT APPLICATION) ////
>
> g = EmptyGraph.instance().traversal()
>
> t = g.V().has('name','marko').
>       repeat(out()).times(2).
>       groupCount().by('name'); []
> bytecode = t.bytecode
> // send the bytecode over the wire
>
> //// EXECUTED REMOTELY (e.g. GREMLIN SERVER) ////
>
> groovy = new GremlinGroovyScriptEngine()
> bindings = groovy.createBindings()
> bindings.put('g',g)
> compiled = groovy.compile(GroovyTranslator.of('g').translate(bytecode))
>
> x = JavaTranslator.of(g).translate(bytecode); []
> y = compiled.eval(bindings); []
> z = groovy.eval(GroovyTranslator.of('g').translate(bytecode), bindings); []
> x == y
> y == z
> z == x
> x.toString()
>
> clock(1000){ JavaTranslator.of(g).translate(bytecode) }
> clock(1000){ compiled.eval(bindings) } // caching
> clock(1000){ groovy.reset();
> groovy.eval(GroovyTranslator.of('g').translate(bytecode), bindings) } // no
> caching
>
>
> First, lets make sure they all return the same traversal:
>
> gremlin> x = JavaTranslator.of(g).translate(bytecode); []
> gremlin> y = compiled.eval(bindings); []
> gremlin> z = groovy.eval(GroovyTranslator.of('g').translate(bytecode),
> bindings); []
> gremlin> x == y
> ==>true
> gremlin> y == z
> ==>true
> gremlin> z == x
> ==>true
> gremlin> x.toString()
> ==>[GraphStep(vertex,[]), HasStep([name.eq(marko)]),
> RepeatStep([VertexStep(OUT,vertex),
> RepeatEndStep],until(loops(2)),emit(false)), GroupCountStep(value(name))]
> gremlin>
>
>
> Great. They do. Now lets see how fast they are.
>
> gremlin> clock(1000){ JavaTranslator.of(g).translate(bytecode) }
> ==>0.004768085
> gremlin> clock(1000){ compiled.eval(bindings) } // caching
> ==>0.015168259
> gremlin> clock(1000){ groovy.reset();
> groovy.eval(GroovyTranslator.of('g').translate(bytecode), bindings) } // no
> caching
> ==>40.790075693
> gremlin>
>
>
> Cool. JavaTranslator is about 1000x faster than a evaluating a String script
> and about 3x faster than evaluating a compiled script. JavaTranslator takes
> about 40 micro-seconds to translate the bytecode, while an uncached String
> script takes 40 milliseconds.
>
> So, what did we learn?
>
> 1. Bytecode is slick in that we don’t have to use Gremlin-Groovy to evaluate
> it (if there are no lambdas) and thus, can do everything in Java and fast!
> 2. It very important to always use parameterized queries with
> GremlinServer/etc. as you can see how costly it is to evaluate a String
> script repeatedly.
>
> What is crazy is that my JavaTranslator code is gheeeeeetto.
>
> https://github.com/apache/tinkerpop/blob/master/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java
>
> If anyone wants to submit a PR to make JavaTranslator more efficient, please
> do. However, we are still doing well with what we have regardless.
>
> Take care,
> Marko.
>
> http://markorodriguez.com
>
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "Gremlin-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to gremlin-users+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/gremlin-users/05AFFEA0-3982-4F61-856F-6CE0CBD51602%40gmail.com.
> For more options, visit https://groups.google.com/d/optout.



-- 
Robert Dale

Reply via email to