[#4651] Significant overhead caused by AbstractContext's internal ArrayDeque stacks that created even if there are no VisitListeners

This commit is contained in:
lukaseder 2015-10-17 18:09:34 +02:00
parent 8238789057
commit a67d22e2ed

View File

@ -97,12 +97,9 @@ abstract class AbstractContext<C extends Context<C>> extends AbstractScope imple
AbstractContext(Configuration configuration, PreparedStatement stmt) {
super(configuration);
this.stmt = stmt;
this.visitClauses = new ArrayDeque<Clause>();
VisitListenerProvider[] providers = configuration.visitListenerProviders();
boolean userInternalVisitListener =
false
/* [pro] xx
@ -113,8 +110,6 @@ abstract class AbstractContext<C extends Context<C>> extends AbstractScope imple
;
this.visitListeners = new VisitListener[providers.length + (userInternalVisitListener ? 1 : 0)];
this.visitContext = new DefaultVisitContext();
this.visitParts = new ArrayDeque<QueryPart>();
for (int i = 0; i < providers.length; i++)
this.visitListeners[i] = providers[i].provide();
@ -123,6 +118,17 @@ abstract class AbstractContext<C extends Context<C>> extends AbstractScope imple
xx xxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx x xxx xxxxxxxxxxxxxxxxxxxxxxxx
xx [/pro] */
if (this.visitListeners.length > 0) {
this.visitContext = new DefaultVisitContext();
this.visitParts = new ArrayDeque<QueryPart>();
this.visitClauses = new ArrayDeque<Clause>();
}
else {
this.visitContext = null;
this.visitParts = null;
this.visitClauses = null;
}
}
// ------------------------------------------------------------------------
@ -188,12 +194,11 @@ abstract class AbstractContext<C extends Context<C>> extends AbstractScope imple
@Override
public final C start(Clause clause) {
if (clause != null) {
if (clause != null && visitClauses != null) {
visitClauses.addLast(clause);
for (VisitListener listener : visitListeners) {
for (VisitListener listener : visitListeners)
listener.clauseStart(visitContext);
}
}
return (C) this;
@ -201,10 +206,9 @@ abstract class AbstractContext<C extends Context<C>> extends AbstractScope imple
@Override
public final C end(Clause clause) {
if (clause != null) {
for (VisitListener listener : visitListeners) {
if (clause != null && visitClauses != null) {
for (VisitListener listener : visitListeners)
listener.clauseEnd(visitContext);
}
if (visitClauses.removeLast() != clause)
throw new IllegalStateException("Mismatch between visited clauses!");
@ -214,22 +218,27 @@ abstract class AbstractContext<C extends Context<C>> extends AbstractScope imple
}
private final QueryPart start(QueryPart part) {
visitParts.addLast(part);
if (visitParts != null) {
visitParts.addLast(part);
for (VisitListener listener : visitListeners) {
listener.visitStart(visitContext);
for (VisitListener listener : visitListeners)
listener.visitStart(visitContext);
return visitParts.peekLast();
}
else {
return part;
}
return visitParts.peekLast();
}
private final void end(QueryPart part) {
for (VisitListener listener : visitListeners) {
listener.visitEnd(visitContext);
}
if (visitParts != null) {
for (VisitListener listener : visitListeners)
listener.visitEnd(visitContext);
if (visitParts.removeLast() != part)
throw new RuntimeException("Mismatch between visited query parts");
if (visitParts.removeLast() != part)
throw new RuntimeException("Mismatch between visited query parts");
}
}
/**