Erweiterung:Missbrauchsfilter/Bedingungen
Essay: Der Bedingungsbegrenzer ist ein etwas improvisiertes Werkzeug zur Vermeidung von Leistungsproblemen. Sofern du dich um die Leistung sorgen möchtest, sind Ausführungszeiten im Allgemeinen ein besserer Maßstab, über den du nachdenken solltest. Die Zeiten und die Bedingungszahlen pro Filter sind etwas fehlerhaft (Wettlaufsituationen können dazu führen, dass sie falsch sind), aber die meiste Zeit sollten sie gut genug sein, um sich darauf zu verlassen.
Die Bedingungsgrenze verfolgt (mehr oder weniger) die Anzahl der Vergleichsoperatoren + Anzahl der eingegebenen Funktionsaufrufe. Sie ist jedoch auch intelligent genug, um Funktionen und Klammergruppen zu umgehen, wenn der Wert keine Rolle spielt. Beispielsweise werden im Ausdruck A & B die Details von B nur ausgewertet, wenn A wahr ist. Aus diesem Grund ist es für die Leistung von Vorteil, einfache einschränkende Bedingungen, z. B. Prüfungen auf Artikel-Namesräume, vor komplexere Ausdrücke zu setzen. Schließlich ist zu beachten, dass Funktionsaufrufe zwischengespeichert werden, sodass sie nur dann zur Bedingungsanzahl hinzugefügt werden, wenn zum ersten Mal ein bestimmtes Funktionsergebnis angefordert wird.
MediaWiki 1.27 und neuer
Praktische Ratschläge
- Platziere die Bedingungen, die leicht auszuwerten, aber schwer abzugleichen sind, am Anfang eines Filters. Dadurch wird der Abgleich mit dem Filter so schnell wie möglich abgeschlossen, was die Laufzeiten verbessert und die Verwendung von Bedingungen reduziert.
- Wenn du nach dem Vorkommen mehrerer Zeichenketten in einem Text suchst (was bei Filtern zur Spam-Erkennung häufig vorkommt), ist es viel schneller,
contains_any(text, 'a', 'b', 'c')
odertext rlike 'a|b|c'
zu verwenden, als einen separaten Test für jede Zeichenkette ('a' in text | 'b' in text | 'c' in text
). Außerdem werden dabei weniger Bedingungen verbraucht. - Alle
user_*
-Variablen außeruser_name
erfordern möglicherweise eine Datenbankabfrage. Ihre Verwendung ist also aufwändiger als die von vorkalkulierten Variablen wieaction
undpage_namespace
. Sie sollten möglichst nicht als erste Bedingung eines Filters verwendet werden. (Dies kann die Anzahl der Bedingungen verringern oder erhöhen, je nachdem, ob die Übereinstimmung aufgrund der neuen Reihenfolge früher oder später erfolgt. Die tatsächliche Leistung sollte sich dadurch jedoch verbessern.)
Allgemeine Zählung
Regeln | verbrauchte Bedingungen | Anmerkungen |
---|---|---|
'foo' == 'bar' |
1 | Ein einfacher Test zählt als eine Bedingung. |
'foo' == 'bar' | 'baz' == 'qaz' |
2 | |
'foo' == 'bar' & 'baz' == 'qaz' |
1 | Tests werden nicht gezählt, wenn sie zur Ermittlung des Ergebnisses nicht ausgewertet werden müssen (Kurzschlussauswertung).
|
'foo' == 'foo' | 'baz' == 'qaz' |
1 | |
str_replace( 'FooFoo', 'Foo', '' ) == 'bar' |
2 | Jeder Funktionsaufruf zählt ebenfalls als eine Bedingung. |
str_replace( 'FooFoo', 'Foo', '' ) == 'bar' |
3 | Wiederholte Funktionsaufrufe mit identischen Argumenten werden nur einmal gezählt. |
Beispiel 1
Als praktisches Beispiel betrachten wir Filter 59 aus der englischsprachigen Wikipedia:
page_namespace == 6 & !("autoconfirmed" in user_groups) & !(user_name in page_recent_contributors) & rcount ("\{\{.*\}\}", removed_lines) > rcount ("\{\{.*\}\}", added_lines)
Dies kann vereinfacht werden zu:
- A & !B & !C & fun1() > fun2()
Abhängig von den Werten der Variablen kann der Filter 1 bis 6 Bedingungen verbrauchen:
- 1 Bedingung (1 Vergleich) wenn der erste Test falsch ist — die restlichen Tests werden nicht ausgewertet
- 2 Bedingungen (2 Vergleiche) wenn der erste Test wahr ist, der zweite jedoch falsch — die restlichen Tests werden nicht ausgewertet
- 3 Bedingungen (3 Vergleiche) wenn der erste und zweite Test wahr sind, der dritte jedoch falsch — die restlichen Tests werden nicht ausgewertet
- 6 Bedingungen (3 Vergleiche + 2 Funktionsaufrufe + 1 Vergleich) wenn der erste, zweite und dritte Test wahr sind.
Wenn die erste Bedingung selten zutrifft, wie es bei page_namespace == 6
wahrscheinlich der Fall ist, verbraucht der Filter in den meisten Durchläufen nur eine Bedingung.