[ https://issues.apache.org/jira/browse/OAK-1130?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13809152#comment-13809152 ]
Thomas Mueller commented on OAK-1130: ------------------------------------- Proposed patch. Changes in the AbstractRoot: use ImmutableTree instead of mutable. Changes in AstElement: cache the used last tree. {code} Index: src/main/java/org/apache/jackrabbit/oak/core/AbstractRoot.java =================================================================== --- src/main/java/org/apache/jackrabbit/oak/core/AbstractRoot.java (revision 1537076) +++ src/main/java/org/apache/jackrabbit/oak/core/AbstractRoot.java (working copy) @@ -329,7 +329,11 @@ @Override protected ExecutionContext getExecutionContext() { NodeState rootState = AbstractRoot.this.getRootState(); - return new ExecutionContext(rootState, rootTree, getIndexProvider(rootState)); + Context c = securityProvider.getConfiguration(AuthorizationConfiguration.class).getContext(); + PermissionProvider pp = permissionProvider.get(); + SecureNodeState s = new SecureNodeState(rootState, pp, c); + ImmutableTree t = new ImmutableTree(s); + return new ExecutionContext(rootState, t, getIndexProvider(rootState)); } private QueryIndexProvider getIndexProvider(NodeState rootState) { Index: src/main/java/org/apache/jackrabbit/oak/query/ast/AstElement.java =================================================================== --- src/main/java/org/apache/jackrabbit/oak/query/ast/AstElement.java (revision 1537076) +++ src/main/java/org/apache/jackrabbit/oak/query/ast/AstElement.java (working copy) @@ -30,6 +30,8 @@ abstract class AstElement { protected QueryImpl query; + private Tree lastTree; + private String lastPath; abstract boolean accept(AstVisitor v); @@ -123,7 +125,11 @@ } protected Tree getTree(String path) { - return query.getTree(path); + if (lastPath == null || !path.equals(lastPath)) { + lastTree = query.getTree(path); + lastPath = path; + } + return lastTree; } } {code} > Performance issues with MutableTree > ----------------------------------- > > Key: OAK-1130 > URL: https://issues.apache.org/jira/browse/OAK-1130 > Project: Jackrabbit Oak > Issue Type: Bug > Components: core, query > Reporter: Thomas Mueller > > Benchmarks show that simple queries are slower in Oak than in Jackrabbit 2.x. > The profiling data shows that most time is spent in the MemoryNodeBuilder > (see below), called from MutableTree, even thought the query engine > internally doesn't need mutable trees. > It would be nice if creating a tree is faster (MemoryNodeBuilder, MutableTree > and related). Many components would benefit from that. Unfortunately, the > code is quite complex (meaning, I don't understand it). > I found two alternatives to speed up queries: > * Not use MutableTree within the query engine, but instead use ImmutableTree. > This gave a small performance boost (maybe 15%) > * Cache trees in the query engine, to avoid creating the same tree multiple > times. This gave a speedup of about 50% (twice as fast) for some tests. > Package summary and top stack trace as reported by the profiler. > {code} > summary: > 65%: org.apache.jackrabbit.oak.plugins.memory > 9%: org.apache.jackrabbit.oak.plugins.segment > 4%: org.apache.jackrabbit.oak.jcr.session.operation > 3%: org.apache.jackrabbit.oak.query > 2%: com.google.common.collect > 2%: org.apache.jackrabbit.oak.namepath > 341/3234 (10%): > org.apache.jackrabbit.oak.plugins.memory.MemoryNodeBuilder$ConnectedHead.getCurrentNodeState(MemoryNodeBuilder.java:601) > org.apache.jackrabbit.oak.plugins.memory.MemoryNodeBuilder$UnconnectedHead.update(MemoryNodeBuilder.java:535) > org.apache.jackrabbit.oak.plugins.memory.MemoryNodeBuilder.head(MemoryNodeBuilder.java:152) > org.apache.jackrabbit.oak.plugins.memory.MemoryNodeBuilder.exists(MemoryNodeBuilder.java:254) > org.apache.jackrabbit.oak.core.SecureNodeBuilder.getChildNode(SecureNodeBuilder.java:299) > org.apache.jackrabbit.oak.core.MutableTree.<init>(MutableTree.java:76) > org.apache.jackrabbit.oak.core.MutableTree.createChild(MutableTree.java:86) > org.apache.jackrabbit.oak.core.MutableTree.getChild(MutableTree.java:222) > org.apache.jackrabbit.oak.util.TreeUtil.getTree(TreeUtil.java:169) > org.apache.jackrabbit.oak.query.QueryImpl.getTree(QueryImpl.java:604) > org.apache.jackrabbit.oak.query.ast.AstElement.getTree(AstElement.java:126) > org.apache.jackrabbit.oak.query.ast.SelectorImpl.currentTree(SelectorImpl.java:351) > {code} > Some benchmark results for the oak-run SimpleSearchTest with combination of > changes (patch will follow). Just "N", meaning number of iterations within 10 > seconds (higher is better), using Oak-Tar: > * old (mutable tree, no cache): 36 > * immutable tree only: 42 > * cache only: 65 > * cache+immutable: 76 -- This message was sent by Atlassian JIRA (v6.1#6144)