Ich habe eine Methode, die alle Kombinationen von fünf verschiedenen Bedingungen mit 32 if-else-Anweisungen überprüft (denken Sie an die Wahrheitstabelle). Die fünf verschiedenen Buchstaben stellen Methoden dar, die jeweils ihre eigenen regulären Ausdrücke in einer Zeichenfolge ausführen und einen booleschen Wert zurückgeben, der angibt, ob die Zeichenfolge mit der Regex übereinstimmt oder nicht. Zum Beispiel:
%Vor%Es beeinflusst jedoch wirklich die Leistung meiner Anwendung (Entschuldigung, ich kann nicht auf zu viele Details eingehen). Kann jemand einen besseren Weg empfehlen, mit einer solchen Logik umzugehen?
Jede Methode, die einen regulären Ausdruck verwendet, sieht folgendermaßen aus:
%Vor%Danke!
Ohne weitere Details zu kennen, kann es hilfreich sein, die if-Anweisungen so anzuordnen, dass diejenigen, die das "schwere" Heben durchführen, zuletzt ausgeführt werden. Dies macht die Annahme, dass die anderen Bedingungen wahr sind, wodurch die "schweren" anhebenden alle zusammen vermieden werden. Kurz gesagt, nutzen Sie möglichst Kurzschlüsse.
Alle obigen Antworten sind falsch, weil die richtige Antwort auf eine Optimierungsfrage lautet: Messen! Verwenden Sie einen Profiler, um zu messen, wo der Code seine Zeit verbringt.
Nachdem ich das gesagt habe, wäre ich bereit zu wetten, dass der größte Gewinn darin besteht, die Regexe nicht mehr als einmal zu kompilieren. Und danach, wie andere vorgeschlagen haben, nur jede Bedingung einmal bewerten und die Ergebnisse in booleschen Variablen speichern. So hat Thait84 die beste Antwort.
Ich bin auch bereit zu wetten, dass jtahlborn und Peter Lawreys und Salvatore Previti Vorschläge (im Wesentlichen die gleichen), obwohl sie clever sind, Ihnen einen vernachlässigbaren zusätzlichen Nutzen bringen werden, es sei denn, Sie laufen auf einem 6502 ...
(Diese Antwort liest sich wie ich bin voll davon, also im Interesse der vollständigen Offenlegung sollte ich erwähnen, dass ich eigentlich bei der Optimierung hoffnungslos bin. Aber Messen ist immer noch die richtige Antwort.)
Führe die Regex einmal für jede Zeichenkette aus und speichere die Ergebnisse in booleschen Werten und tue einfach das if / else auf den booleschen Werten, anstatt die regex mehrmals auszuführen. Versuchen Sie außerdem, eine vorkompilierte Version Ihrer Regex erneut zu verwenden und diese erneut zu verwenden, wenn Sie können.
Eine mögliche Lösung: Verwenden Sie einen Schalter, der einen Binärwert erzeugt.
%Vor%Wenn Sie den Schalter umgehen und ein Array verwenden können, wäre es schneller.
Ich habe eine Lösung mit EnumSet. Aber es ist zu ausführlich und ich denke, ich bevorzuge @Peter Lawreys Lösung.
In Effective Java von Bloch wird empfohlen, EnumSet über Bitfelder zu verwenden, aber ich würde hier eine Ausnahme machen. Nichtsdestotrotz postete ich meine Lösung, weil sie für jemanden mit einem etwas anderen Problem nützlich sein könnte.
%Vor%und du verwendest es so:
%Vor%Aber es wäre effizienter wie folgt:
%Vor%Sie könnten auch Ihren if / else an einen Schalter / Fall anpassen (was ich verstehe, ist schneller)
Vorgenerieren von A, B, C, D und E als boolesche Werte, anstatt sie in if
-Bedingungen zu bewerten, würde sowohl Lesbarkeit als auch Leistung bieten. Wenn Sie sich auch Gedanken über die Leistung der verschiedenen Fälle machen, können Sie sie als Baum organisieren oder zu einer einzigen ganzen Zahl kombinieren (X = (A? 1: 0) | (B? 2: 0) | ... | ( E? 16: 0)), die Sie in switch
verwenden würden.
Tags und Links java performance conditional if-statement