我正在使用以下代码从连接到大型ISP网络的路由器丢弃不支持的物理接口/子接口(大的意思是成千上万的路由器):
private final static Pattern INTERFACES_TO_FILTER =
Pattern.compile("unrouted VLAN|GigabitEthernet.+-mpls layer|FastEthernet.+-802\\.1Q vLAN subif");
// Simplification
List interfaces;
// lots of irrelevant code to query the routers
for (String intf : interfaces) {
if (INTERFACES_TO_FILTER.matcher(intf).find()) {
// code to prevent the interface from being used
}
}
这个想法是丢弃以下条目:
>针对GigabitEthernet2 / 11.2000的未路由VLAN 2000
> GigabitEthernet1 / 2-mpls层
> FastEthernet6 / 0 / 3.2000-802.1Q vLAN subif
这个代码在大量接口(一些路由器有50k子接口)上经常被击中(每分钟几次),由于新的子接口经常被配置/丢弃,因此高速缓存并没有多大帮助.计划是优化正则表达式,以便程序更快地完成(每纳秒计数).你们能开导我吗?
注意:其他类型的接口支持mpls层和802.1Q,未路由的VLAN不支持.
解决方法:
有一些字符串搜索算法允许您尝试以比明显的O(n * k)成本更便宜的k字符串搜索长度为n的字符串.
它们通常将滚动哈希与您单词的现有哈希列表进行比较.这方面的一个主要例子是Rabin-Karp algorithm.维基页面甚至有一个关于此的部分.还有更高级的原理版本,但很容易理解这个原理.
不知道Java中是否已经存在这样做的库(我想是这样的),但这就是我要尝试的 – 尽管这里有5个字符串相当小(不同的大小也使它更复杂).所以最好检查一个好的KMP字符串搜索是不是更快 – 我认为这是迄今为止最好的解决方案(默认的java api使用了一个天真的字符串搜索,所以使用一个lib)
关于你的正则表达式:回溯性能关键搜索代码的正则表达式实现?我怀疑这是个好主意.
PS:如果你为你的问题发布一个测试集和一个测试工具,很可能人们会看到他们能够击败最喜欢的东西 – 以前工作过..人性很容易欺骗:)
标签:java,regex,optimization
来源: https://codeday.me/bug/20190826/1731715.html