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.