我对Android平台上的正则表达式有疑问。最近我尝试用java实现它们,但java实现有点慢。过了一段时间,我决定把它带到一个新的水平,并在NDK的native-c平台上实现它们,我想我将获得巨大的性能提升。看来我错了。 (实际上C代码的工作速度比java快2-3倍)
以下是我用于搜索姓名的代码:
爪哇:
Pattern pattern = Pattern.compile(regex);
Matcher matcher;
matcher = pattern.matcher(name);
if(matcher.find()) {
// get positions
s = matcher.start();
e = matcher.end();
temp = new SearchedStruct();
temp.position = i;
temp.position_word = s;
temp.position_word_end = e;
listFound.add(temp);
}
C :(我跳过很长一段时间,我编译te正则表达式并获得名称......)
regRes = regexec(®ex, name, nmatch, &match_ptr, 0);
if(!regRes) { // we got a match! }
正则表达式有点长,例如: Java的: “(一个\ s * | b \ S * | C \ S * | 2个\ S *)(d \ S * |电子\ S * | F \ S * | 3个\ S *)(一个\ s * | b \ S * | C \ S * | 2个\ S *)(d \ S * |电子\ S * | F \ S * | 3个\ S *)“
C: “(a([\ t' - ]) | b([\ t' - ]) | c([\ t' - ]) | 2([\ t'-] ))(p([\ t' - ]) | q([\ t' - ]) | r([\ t' - ]) | s([ \ t' - ]) | 7([\ t' - ])*)“
使用Java搜索1000个名称的时间大约为100-300毫秒,使用C代码搜索大小为500-1000毫秒。
为什么C正则表达式引擎比Java Matcher慢2-3倍?因为我预计C正则表达式要快得多(快3-4倍)