Frage
Wie schreibe ich effizientere Nachrichtenfilter?
Wenn Nachrichtenfilter länger werden, können sie die Leistungsmerkmale Ihrer ESA beeinflussen. Bei einer geringen Anzahl von Filtern oder kurzen Filtern ist Effizienz kein großes Problem. Wenn Sie jedoch längere Filter erstellen oder Ihre Implementierung über viele Filter verfügt, sollten Sie die relative Effizienz bestimmter Vorgänge berücksichtigen.
Beim Übergeben von Nachrichten durch die Nachrichtenpipeline werden alle Nachrichtenfilter zu einem einzigen Ausdruck zusammengefasst, der atomisch für jede Nachricht ausgewertet wird. Das bedeutet, dass die Reihenfolge der Filter sehr wichtig ist und eine weitere Auswertung des kombinierten Ausdrucks kurzschließen kann. Wenn Sie beispielsweise eine Reihe von Filtern haben, die auf Nachrichten angewendet werden, aber ein Filter sehr häufig angewendet wird und eine abschließende Aktion mit "deliver()", "bounce()" oder "drop()" verknüpft ist, sollte dieser Filter so früh wie möglich in der Liste verschoben werden.
Obwohl die ESA bei der Verarbeitung regulärer Ausdrücke sehr effizient ist, können Sie die Engine für reguläre Ausdrücke so missbrauchen, dass eine zusätzliche oder unnötige Verarbeitung möglich ist. Jede Evaluierung eines regulären Ausdrucks benötigt ungefähr die gleiche Anzahl an Ressourcen, was bedeutet, dass die Reduzierung der Anzahl der auswerteten Ausdrücke zu einer höheren Effizienz führt. Im folgenden Filter werden beispielsweise die regulären Ausdrücke in jedem "Drop-Attachments-by-Name" einzeln ausgewertet, was bedeutet, dass die Bewertung des regulären Ausdrucks 7 Mal erfolgt, wenn der Name der Anlage mit dem Muster im Dropdown-Attachments-by-Name verglichen wird:
strip_all_dangerous: if (true) {
drop-attachments-by-name('(?i)\\.pif$');
drop-attachments-by-name('(?i)\\.exe$');
drop-attachments-by-name('(?i)\\.scr$');
drop-attachments-by-name('(?i)\\.msi$');
drop-attachments-by-name('(?i)\\.java$');
drop-attachments-by-name('(?i)\\.dll$');
drop-attachments-by-name('(?i)\\.com$');
}
Im folgenden Beispiel sind die Ergebnisse äquivalent, aber das Beispiel ist viel effizienter, sodass nur eine Bewertung für reguläre Ausdrücke erfolgt:
strip_all_dangerous: if (true) {
drop-attachments-by-name('(?i)\\.(pif|exe|scr|msi|java|dll|com)$');
}
Obwohl der zweite reguläre Ausdruck komplexer ist als die sieben im ersten Filter, ist es viel effizienter, einen komplexen regulären Ausdruck zu evaluieren als sieben einfache.
Diese Technik muss jedoch mit den Kosten für die Wartung eines solchen Filters abgewogen werden.