Groovy 模式和性能

最后,来看看模式的性能和模式操作符 ~String。

模式操作符转换一个字符串为java.util.regex.Pattern对象实例,对于给定的字符串,通过这个模式对象可以查询到matcher对象。

构建这个理论基础是:模式一个有限状态机,在模式对象被创建的时候编译这个有限状 态机,结构更复杂的模式。对于更复杂的模式,需要更长的创建时间,通过对比,通过有限状态机进行匹配处理是非常快的。

模式操作符把模式创建的时间从模式匹配的时间中分离出来,通过重用有限状态机提升了性能,列表3.7显示了一个可怜人在这两种方式的性能比较,预编译模式至少快20%。

为了找到开始字符和结束字符相同的单词,使用\1引用到后面的匹配,把单词的第一个字符放在一个分组中,这个分组的编号为1。

注意(1)的书写不是a =~ b,而是a = ~b,小心这个地方!!

敏感的读者也许发现了一个问题:如果写成a=~b(中间没有任何空格)会发生什么事情?它是=~操作符,还是给a分配~b模式?对于人性化的阅读,这是容易引起歧义的,对于groovy转换器来说不是这样的,groovy转换器进行贪婪匹配,并且将这个转换为=~操作符。

保留空格是一个好的编程风格,即使转换器能正确的识别,为了代码的可阅读性,应该这样做。

不要忘记性能同时是在次于可读性的——至少在开始是这样的,如果重用一个模式导致你的代码不完美,那么在修改代码之前应该评价各种性能,测量出不同版本的代码在不同情况下的性能,并且平衡可维护性和内存要求。