论述: 条件判断限制器是一种避免性能问题的特设工具。从某些程度上说,如果阁下非常关心性能问题,执行时间一般是一个极好的参考性能指标。每过滤器执行时间和条件判断数量有些时候并不准确(竞态条件可以导致它们出现了偏差),但是总体上来说它们也可以用作参考指标。
条件判断限制是一种比较运算符数量和函数(方法)调用数量的跟踪机制。然而它也可以在不影响结果的情形下机智地跳过函数(方法)和括号组。举个例子,在表达式 A & B 中,B 的情况只会在 A 为真时被评估。出于此理由,将简单的条件(例如检查文章名字空间)放在复杂的表达式前对性能是大有脾益的。最后需要注意的是,函数(方法)将会被缓存,所以它们只会在第一次被调用的时候增加条件判断计数。
介于萌百的实际部署情况,此段不翻译,请参考 to MediaWiki 1.27 Prior to MediaWiki 1.27 上的内容。
contains_any(text, 'a', 'b', 'c')
或 text rlike 'a|b|c'
远快于 对每个字符串进行单独的测试 ('a' in text | 'b' in text | 'c' in text
)。这样也使用了更少的条件判断。user_name
的 user_*
变量可能需要一次数据库查询。因此,使用它们相比使用预定义变量如 action
and article_namespace
来说成本更为昂贵。它们应该不被作为过滤器的第一个条件使用(取决于新的顺序使得匹配的完成的耗时,这可能会减少或增加条件判断计数,但应该改善了总体性能)。
Rules | 使用的条件 | 备注 |
---|---|---|
'foo' == 'bar' |
1 | 一个计数为一次的简单条件判断。 |
'foo' == 'bar' | 'baz' == 'qaz' |
2 | |
'foo' == 'bar' & 'baz' == 'bar' |
1 | 不需要被评估来用于决定最终结果的测试没有被计数。 (短路求值)
|
'foo' == 'foo' | 'baz' == 'qaz' |
1 | |
str_replace( 'FooFoo', 'Foo', '' ) == 'bar' |
2 | 每个函数(方法)调用被视作一次条件判断计数。 |
str_replace( 'FooFoo', 'Foo', '' ) == 'bar' |
3 | 相同参数的同函数(方法)调用被视作仅一次条件判断计数。 |
举一个实际例子,考虑 英文维基百科的过滤器 #59:
article_namespace == 6 & !("autoconfirmed" in user_groups) & !(user_name in article_recent_contributors) & rcount ("\{\{.*\}\}", removed_lines) > rcount ("\{\{.*\}\}", added_lines)
这可以被简化为:
取决于变量的值,过滤器可以消耗1到6个条件判断:
如果初始条件罕见地为真(比如 article_namespace == 6
可能是),那么过滤器在多数情况只需要下消耗一个条件判断。
|