问题
如何写效率更高消息过滤器?
当消息过滤器长期获得,他们能影响您的ESA的性能特性。对于很小数量的过滤器或短的过滤器,效率不是重大的关心。然而,当修建更长的过滤器或,如果您的实施有许多过滤器时,您应该是记住某些操作相对效率。
当传递消息通过消息传递途径时,所有消息过滤器被结合到被评估用每个消息的一个基本方式的单个表达式。这意味着预定过滤器是非常重要的,并且能短路联合的表达式的进一步评估。例如,如果有将适用于消息的一定数量的过滤器,但是一台过滤器非常频繁地将适用并且有与它产生关联的一最后的行动deliver()、bounce()或者drop(),一样及早列表应该移动过滤器尽可能。
虽然ESA是非常高效的在其处理常规表示,您能滥用常规表示引擎就象导致另外或多余处理。常规表示的每个评估大致采取相同数量资源,因此意味着那减少您评估表达式的数量将产生更加了不起的效率。例如,在以下过滤器,在每个“丢弃附件由NAME的”常规表示是全部单个被评估的,意味着常规表示评估发生7次,当比较附件名字对在丢弃附件由NAME时的模式:
strip_all_dangerous :如果(真) {
丢弃附件由NAME (‘(?i) \ \ .pif$’);
丢弃附件由NAME (‘(?i) \ \ .exe$’);
丢弃附件由NAME (‘(?i) \ \ .scr$’);
丢弃附件由NAME (‘(?i) \ \ .msi$’);
丢弃附件由NAME (‘(?i) \ \ .java$’);
丢弃附件由NAME (‘(?i) \ \ .dll$’);
丢弃附件由NAME (‘(?i) \ \ .com$’);
}
在以下示例中,结果是等同的,但是示例效率更高,导致仅单个常规表示评估:
strip_all_dangerous :如果(真) {
丢弃附件由NAME (‘(?i) \ \。(pif|exe|scr|msi|Java|dll|com) $’);
}
虽然第二常规表示比七部分复杂在第一台过滤器,比七简单一个是效率更高评估一复杂常规表示。
然而,此技术一定是平衡的维护这样过滤器的费用。