业务办理的时候发现正则的匹配效率极其低下,耗时居然要1分钟,而jdk的String的index这个类居然耗时只有100分之一,至于具体的区别如下
具体的代码逻辑如下:
1、正则匹配耗时监控
//10、资讯主表、快讯表当【新闻来源】和【媒体出处】不等于 新华网/新华社/新华每日电讯/中国金融信息网/中国金融信息网(微博)/国家财经周刊/新华视点 时,
// 内容里包含新华网/新华社/新华每日电讯/中国金融信息网/中国金融信息网(微博)/国家财经周刊/新华视点 时,
// 做校验提示,提示语: 内容可能涉及被限制的新华社版权媒体相关,确认要公开吗?
if (!HtmlFilterTagUtils.isPattern(dsSourceName, ".*(新华网|新华社|新华每日电讯|中国金融信息网|中国金融信息网\\(微博\\)|国家财经周刊|新华视点).*")) {
if (!HtmlFilterTagUtils.isPattern(mediaSource, ".*(新华网|新华社|新华每日电讯|中国金融信息网|中国金融信息网\\(微博\\)|国家财经周刊|新华视点).*")) {
if (HtmlFilterTagUtils.isPattern(content, ".*(新华网|新华社|新华每日电讯|中国金融信息网|中国金融信息网\\(微博\\)|国家财经周刊|新华视点).*")) {
raiseInfo.add("内容可能涉及被限制的新华社版权媒体相关,确认要公开吗?");
}
}
}
Instant endTimeMark4 = Instant.now();
Long period4 = Duration.between(endTimeMark3, endTimeMark4).toMillis();
log.error("getFirstVersionCheck--->HtmlFilterTagUtils.isPattern 耗时{} 毫秒", operateVo.getNewsId(), period4);
2、正则匹配耗时监控结果:
2020-12-04 10:19:43.620| :checkPublish--->context.executeStrategy资讯id :【1181785279403】context.executeStrategy走完,耗时26165 毫秒
3.使用JDK里面的String类里面的.indexOf("新华网") > 0来替代正则匹配方式
//10、资讯主表、快讯表当【新闻来源】和【媒体出处】不等于 新华网/新华社/新华每日电讯/中国金融信息网/中国金融信息网(微博)/国家财经周刊/新华视点 时,
// 内容里包含新华网/新华社/新华每日电讯/中国金融信息网/中国金融信息网(微博)/国家财经周刊/新华视点 时,
// 做校验提示,提示语: 内容可能涉及被限制的新华社版权媒体相关,确认要公开吗?
if (!HtmlFilterTagUtils.isPattern(dsSourceName, ".*(新华网|新华社|新华每日电讯|中国金融信息网|中国金融信息网\\(微博\\)|国家财经周刊|新华视点).*")) {
if (!HtmlFilterTagUtils.isPattern(mediaSource, ".*(新华网|新华社|新华每日电讯|中国金融信息网|中国金融信息网\\(微博\\)|国家财经周刊|新华视点).*")) {
if (content.indexOf("新华网") > 0 || content.indexOf("新华社") > 0 || content.indexOf("新华每日电讯") > 0
|| content.indexOf("中国金融信息网") > 0 || content.indexOf("中国金融信息网(微博)") > 0 || content.indexOf("国家财经周刊") > 0
|| content.indexOf("新华视点") > 0) {
raiseInfo.add("内容可能涉及被限制的新华社版权媒体相关,确认要公开吗?");
}
}
}
Instant endTimeMark4 = Instant.now();
Long period4 = Duration.between(endTimeMark3, endTimeMark4).toMillis();
log.error("getFirstVersionCheck--->HtmlFilterTagUtils.isPattern 耗时{} 毫秒", operateVo.getNewsId(), period4);
3、第二种耗时统计,大文本的情况下替代掉正则匹配,使用String自有类方法判断,结果如下
2020-12-04 10:19:00.355| :checkPublish--->context.executeStrategy资讯id :【1181785279403】context.executeStrategy走完,耗时6 毫秒
通过以上俩者对比
很明显的结论:
大文本的字符串匹配判断方法,正则不及String的indexof的方法的效率,主要是正则是一个字符串的匹配,而index的是一个汉字来匹配的
下面这个正则表达式作为判断是否匹配,这个正则表达式来判断是否匹配的效率真的很低,发现一片1000汉字的文章,匹配运行居然要1分钟
public static Boolean isPattern(String content, String regex) {
if (StringUtils.isBlank(content)) {
return false;
}
Pattern pa = Pattern.compile(regex, Pattern.DOTALL);
Matcher ma = pa.matcher(content);
if (ma.find()) {
return true;
}
return false;
}
正则匹配HtmlFilterTagUtils.isPattern判断效率如下:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SN0IjM3ATY3kjYiFzNzMDOyYzXxEDO0MTM3EzLcVDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
而jdk的content.indexOf("新华网") > 0运行效率则要快了很多的呢: