如何提供最佳性能(速度)来检查句子是否包含任何关键字1、关键字2、关键字等。
这是我的选择:
- 使用 String.contains:
if(string.contains(item1)||string.contains(item2)||string.contains(item3))
- 或者在上面的
if-or-or-or
失去控制之前为选项 #1 构建一个for
循环。 - 使用正则表达式
- 另一个选项是使用 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/