In meinem Anwendungsfall muss ich mehrere tausend kleine und unabhängige Ausdrücke in eine Baumdarstellung unter Verwendung eines Besuchers auf den generierten Syntaxbäumen analysieren. Derzeit werden für jede Analyseoperation neue Streams, Lexer und Parser-Instanzen erstellt.
Ich nehme an, das ist vielleicht nicht optimal. Welche Objektinstanzen könnten in einem solchen Setup wiederverwendet werden, um die Aufwärmeigenschaften von ANTLR4 zu nutzen? Wie wäre es mit Thread-Sicherheit - welche dieser Instanzen sollte lokal Thread sein? Ist ein Reset erforderlich, um eine Lexer- oder Parser-Instanz erneut zu verwenden?
In den frühen Tagen von ANTLR 4 (viele Monate vor seiner ersten Veröffentlichung) wurde der adaptive DFA-Cache pro Instanz erstellt, sodass die Verwendung von Lexer.setInputStream
oder Parser.setInputStream
wesentlich für das Erreichen einer guten Leistung war.
Dies ist nicht mehr der Fall. Der Hintergrund-Cache ist jetzt unter allen Parser-Instanzen freigegeben und Thread-sicher. Die Methoden der Klassen Lexer
und Parser
sind nicht Thread-sicher. Wenn Sie also mehrere Threads analysieren möchten, müssen Sie mehrere Instanzen Ihres Lexers und Parsers erstellen.
Tags und Links antlr4