Betrachten Sie den folgenden Besucher für einen einfachen Sprachinterpreter.Überspringt "akzeptieren", wo Typ bekannt ist, eine gültige Optimierung für das Besuchermuster?
Der Vollständigkeit halber füge ich etwas Code hinzu, der notwendige Implementierungsdetails gibt (Sie können die Frage überspringen und direkt lesen).
VarStat ::== var Ident = Exp;
Exp ::== Exp + Exp | IntLiteral | Ident
IntLiteral ::== [0-9]{0,8}
Ident ::== [a-zA-Z]+
eine gültige Sprach Instanz
var x = x+y+4;
abstrakte Weise die VarStat
Knoten darzustellen, ist das folgende::
public interface Visitable{
void accept(Visitor v);
}
public class VarStat implements Visitable{
Ident i;
Exp e;
public VarStat(Ident id, Exp ex){
i = id;
e = ex;
}
public Ident getIdent() { return i; }
public Exp getExp() { return e; }
@Override
public void accept(Visitor v){
v.visit(this);
}
}
public interface Exp extends Visitable{
}
public class Ident implements Exp{
@Override
public void accept(Visitor v){
v.visit(this);
}
}
a var Anweisung wird so definiert
. _____VarStat _____
. / /| \ \
. / / | \ \
. / / | \ \
. "var" Ident "=" Exp ";"
Die Frage
Die übliche VisitorPattern Anwendung
void visit(VarStat vs){
vs.getIdent().accept(this);
vs.getExp().accept(this);
//...
}
aber wäre, da ich "Ident" weiß vom Typ Ident
eine mögliche Optimierung ist
void visit(VarStat vs){
visit(vs.getIdent());
vs.getExp().accept(this);
//...
}
Das wäre Überspringe 2 Methodenaufrufe, um die Leistung zu verbessern (tatsächlich gibt es in meinem Szenario einen schönen Schub).
Wird dies als Konstruktionsfehler angesehen, der zu zukünftigen Problemen führen könnte?
_actually gibt es einen schönen Schub mein Szenario_. Ja wirklich ? Wie? – Jayan
Ja, ich möchte auch die gemessenen Zahlen sehen. –
15% schneller. Ausgenutzt an 20 Orten über 25 Methoden (der echte Besucher hat momentan 25 Methoden). Auch einfacher zu debuggen, weil Stack-Trace kleiner wird, warum Timing für Sie wichtig ist? – GameDeveloper