[ 
https://issues.apache.org/jira/browse/TINKERPOP-1444?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15488012#comment-15488012
 ] 

Marko A. Rodriguez commented on TINKERPOP-1444:
-----------------------------------------------

So, having a {{Map<Bytecode,Traversal>}} is ~100x faster than generating the 
traversal from the bytecode via a {{Translator}}.

Here is the benchmark I created in {{TinkerPlayTest}}.

{code}
public void testPlay8() throws Exception {
        Graph graph = TinkerFactory.createModern();
        GraphTraversalSource g = graph.traversal();

        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();
        System.out.println("BYTECODE: " + bytecode + "\n");
        Map<Bytecode, Traversal.Admin<?, ?>> cache = new HashMap<>();
        cache.put(bytecode, traversal.asAdmin());
        final HashSet<?> result = new LinkedHashSet<>(Arrays.asList("ripple", 
"lop"));

        System.out.println("Bytecode->Traversal.clone() cache: " + 
TimeUtil.clock(1000, () -> {
            final Traversal.Admin<?, ?> t = cache.get(bytecode).clone();
            //assertEquals(result, t.next());
        }));

        System.out.println("Bytecode->JavaTranslator call    : " + 
TimeUtil.clock(1000, () -> {
            final Traversal t = JavaTranslator.of(g).translate(bytecode);
            //assertEquals(result, t.next());
        }));

        System.out.println("\n==Second test with reversed execution==\n");

        System.out.println("Bytecode->JavaTranslator call    : " + 
TimeUtil.clock(1000, () -> {
            final Traversal t = JavaTranslator.of(g).translate(bytecode);
            //assertEquals(result, t.next());
        }));

        System.out.println("Bytecode->Traversal.clone() cache: " + 
TimeUtil.clock(1000, () -> {
            final Traversal.Admin<?, ?> t = cache.get(bytecode).clone();
            //assertEquals(result, t.next());
        }));
    }
{code}

The print stream looks as follows:

{code}
BYTECODE: [[], [V(), repeat([[], [out()]]), times(2), groupCount(), by(name), 
select(keys), order(), by(decr)]]

Bytecode->Traversal.clone() cache: 0.025821273999999998
Bytecode->JavaTranslator call    : 0.13305238800000002

==Second test with reversed execution==

Bytecode->JavaTranslator call    : 0.098383349
Bytecode->Traversal.clone() cache: 0.008491400999999999
{code}

CONCLUSION: We should add a Bytecode->Traversal.clone() cache to GremlinServer. 
This will also speed up Groovy-style traversals as you don't have any 
string/compiled script translation to do. Über faster.

> Benchmark bytecode->Traversal creation and implement GremlinServer cache if 
> necessary.
> --------------------------------------------------------------------------------------
>
>                 Key: TINKERPOP-1444
>                 URL: https://issues.apache.org/jira/browse/TINKERPOP-1444
>             Project: TinkerPop
>          Issue Type: Improvement
>          Components: benchmark, language-variant, process, server
>    Affects Versions: 3.2.2
>            Reporter: Marko A. Rodriguez
>
> Right now, when you send {{Bytecode}} to GremlinServer, it will convert the 
> bytecode to a traversal either via Java reflection (Gremlin-Java) or script 
> engine evaluation (e.g. Gremlin-Groovy, Gremlin-Python).
> We should see how fast the process is to go from Bytecode to Traversal and if 
> its "slow" we should create a {{Map<Bytecode,Traversal>}}-cache in 
> GremlinServer.
> The reasons it may be "slow" are:
> 1. {{JavaTranslator}} uses Java reflection to translate bytecode to traversal 
> and that code is a little "thick" and either should be optimized (if 
> possible) or, instead, bytecode/traversal translations should be cached.
> 2. {{Groovy/PythonTranslator}} uses string construction to generate a script 
> from the bytecode. While that script may be cached, it would be good if we 
> have a cache prior to that which simply just grabs the traversal from a 
> bytecode cache.
> I think that we will definitely want a cache as it should make things fast, 
> but it will be good to know how much faster prior to diving into such work.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to