[#4651] Significant overhead caused by AbstractContext's internal ArrayDeque stacks that created even if there are no VisitListeners
This commit is contained in:
parent
8238789057
commit
a67d22e2ed
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Loading…
Reference in New Issue
Block a user