对实例StringEndsWith、StringContains的字符串进行CQEngine查询...使用迭代算法进行匹配运算,你知道为什么不使用正则表达式吗?我认为它是出于性能目的,但对我来说,它的性能是否会优于regex实现并不明显。
示例StringEndsWith:
@Override
boolean matchesSimpleAttribute(SimpleAttribute<O, A> attribute, O object) {
CharSequence attributeValue = attribute.getValue(object);
return containsFragment(attributeValue, value);
}
@Override
boolean matchesNonSimpleAttribute(Attribute<O, A> attribute, O object) {
for (A attributeValue : attribute.getValues(object)) {
if (containsFragment(attributeValue, value)) {
return true;
}
}
return false;
}
static boolean containsFragment(CharSequence document, CharSequence fragment) {
final int documentLength = document.length();
final int fragmentLength = fragment.length();
final int lastStartOffset = documentLength - fragmentLength;
for (int startOffset = 0; startOffset <= lastStartOffset; startOffset++) {
int charsMatched = 0;
for (int endOffset = startOffset, j = 0; j < fragmentLength; j++, endOffset++) {
char documentChar = document.charAt(endOffset);
char fragmentChar = fragment.charAt(j);
if (documentChar != fragmentChar) {
break; // break inner loop
}
charsMatched++;
}
if (charsMatched == fragmentLength) {
return true;
}
}
return false;
}谢谢你的回答。
发布于 2013-12-08 21:13:54
针对特定函数进行优化比针对通用函数进行优化更容易。
正则表达式匹配通常分两个阶段执行:正则表达式的编译和匹配本身。编译将正则表达式转换为表达式树。在编译期间,正则表达式的每个字符都与所有regex特殊字符进行匹配。编译后,可以遍历表达式树以匹配字符串,而不必每次重新解释整个正则表达式。
那么你认为哪个更快呢?直接编译成字节/机器代码或正则表达式"< stringEndWith >$“的字符串首先需要编译成表达式树,然后需要遍历表达式树才能匹配字符串末尾的字符串?在最好的情况下,更多的是理论而不是实践,编译的正则表达式将与stringEndsWith函数一样快地匹配。这意味着编译步骤仍然会减慢你的程序。
希望这能把事情弄清楚。
https://stackoverflow.com/questions/20453260
复制相似问题