速度优化java字符串包含与正则表达式匹配

时间:2017-01-24 20:59:59

标签: java regex optimization

如何提供最佳效果(速度)来检查句子是否包含任何关键字1,关键字2,关键字等。

以下是我的选择:

  1. 使用String.contains:if(string.contains(item1)||string.contains(item2)||string.contains(item3))
  2. 或者在上面for失控之前为选项#1构建if-or-or-or循环。
  3. 使用正则表达式
  4. 另一种选择是使用Java 8 Streaming API目前暂不可用。客户端使用Java 7

2 个答案:

答案 0 :(得分:1)

首先,每个答案都应该在生产条件下进行测试。当性能问题时,RAM和高速缓存大小,总线速度等会发挥作用并使事情难以预测。另一个问题是这个代码运行了多少次--JVM最初将运行它的解释版本,并且只有在代码执行足够多次之后才会用编译(和更快)版本替换它。

话虽如此,这里有一些指示:

  • 如果您有很多关键字,请考虑并行化任务。使用执行程序或并行流。这只适用于大约100多个关键字,并且对于较少量的关键字会使代码变慢。
  • 如果经常使用关键字,请尝试使用某种算法搜索所有关键字,例如使用前缀树(a.k.a。trie)。请注意,这些结构可能会导致内存使用效率低下,因为节点对象可能会分散在内存中,因此在遍历时会导致缓存未命中。这就是为什么ArrayList在实践中比LinkedList更快的原因,即使它们在理论上具有相似的属性。
  • 尝试切换到字节数组(即使用String.getBytes),然后使用Arrays类的方法查找每个单词。这具有内存局部性的优点。请注意,Unicode在这里可能很棘手,因此您可能需要normalize 它首先。

但最重要的是,测试。只需确保您正在进行微观基准properly

答案 1 :(得分:0)

我建议你使用正则表达式,因为它非常简单和强大

    let regionDistance:CLLocationDistance = 100
    let coordinates = CLLocationCoordinate2DMake(lat, lon)
    let regionSpan = MKCoordinateRegionMakeWithDistance(coordinates, regionDistance, regionDistance)
    let options = [
        MKLaunchOptionsMapCenterKey: NSValue(mkCoordinate: regionSpan.center),
        MKLaunchOptionsMapSpanKey: NSValue(mkCoordinateSpan: regionSpan.span),
        MKLaunchOptionsDirectionsModeKey: motType = MKLaunchOptionsDirectionsModeDriving
    ] as [String : Any]
    let mapItem = MKMapItem(placemark: MKPlacemark(coordinate: coordinates, addressDictionary: nil))
    mapItem.name = placeName
    mapItem.openInMaps(launchOptions: options)

STDOUT:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "STRING1|STRING2|STRING3";
final String string = "xxxSTRING1xxxSTRING2xxx";

final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}

在线IDE中的演示:here