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

标签 java regex optimization

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

这是我的选择:

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

最佳答案

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

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

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

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

关于java - 速度优化java字符串包含与正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41838903/

相关文章:

java - 在 Android 上将我的应用程序置于后台后如何恢复以前的应用程序

java - 从字符串中删除时间戳

java - Java 获取一系列值的方法

java - 使用准备好的语句更新

javascript - 正则表达式匹配第一次出现以及之间的所有内容直到最后一次匹配

php - 哪种方法更好地将相关数据存储在表中

python - 如何为 2 支球队相互比赛找到最佳解决方案?

.NET 优化埃拉托色尼 F# 筛法

java - 权限被拒绝 : connect occurs on Selenium 2. 44​​.0

ios - 在NSPredicate和ISBN数字示例中使用正则表达式感到困惑