优化Java正则表达式匹配

时间:2014-10-07 10:51:48

标签: java regex

我正在使用一个应用程序,该应用程序从游戏服务器获取包含日志的udp数据包,并使用它们来收集有关服务器正在发生的事情的信息 - 它通过正则表达式匹配来实现。但是,我遇到一个问题,如果程序一次接收到足够的数据包,cpu使用率会稍微上升 - 在查看线程转储后,这似乎是由于正则表达式匹配...

以下是两种模式的示例:

Pattern pattern = Pattern.compile(".*World triggered \"Game_Over\" reason \"(.+)\"");
Pattern chatPattern = Pattern.compile("\"(.+)<([0-9]+)><\\[(U:[0-9]:[0-9]+)\\]><(Blue|Red)>\" say \"(.+)\"");

然后它根据所述模式和给定的日志行创建一个匹配器并检查匹配。每次收到数据包时,它都会针对5种不同的模式执行此操作 - 如何优化此模式以降低CPU使用率?

1 个答案:

答案 0 :(得分:1)

  

如何优化此功能以降低CPU使用率?

  1. 确保您不会反复&#34;编译&#34;相同的模式;即编译每一次,然后缓存它。

  2. 重构模式,以便在存在共同(元)模式时可以避免重复匹配。

  3. 重构,以便可以使用String.indexOf()完成初始匹配。例如,在第一个中,您可以使用indexOf搜索&#34;世界触发的&#34;。然后使用从初始匹配偏移开始的正则表达式来确认匹配。

  4. 根本不使用正则表达式。硬编码搜索。


  5. 但是在你走这条路之前,你应该配置应用程序,以确认你认为你有性能问题,并且模式匹配真的是一个重要的性能瓶颈。