当前位置: 首页 > news >正文

深圳市建设局工程交易中心网站西安火车站网站建设

深圳市建设局工程交易中心网站,西安火车站网站建设,广州网站建设推荐,网页服务器价格背景 在频繁调用场景,如方法体内或者循环语句中,新定义Pattern会导致重复预编译正则表达式,降低程序执行效率。另外,在 JDK 中部分 入参为正则表达式格式的 API,如 String.replaceAll, String.split 等,也…

背景

在频繁调用场景,如方法体内或者循环语句中,新定义Pattern会导致重复预编译正则表达式,降低程序执行效率。另外,在 JDK 中部分 入参为正则表达式格式的 API,如 String.replaceAll, String.split 等,也需要关注性能问题。

验证

正例:

将 Pattern 对象预编译,并在常量中声明。

    private static final String IP_V4 = "^(((\\d)|([1-9]\\d)|(1\\d{2})|(2[0-4]\\d)|(25[0-5]))\\.){3}((\\d)|([1-9]\\d)|(1\\d{2})|(2[0-4]\\d)|(25[0-5]))$";// Pattern 常量private static final Pattern IP_V4_PATTERN = Pattern.compile(IP_V4);public static boolean isValidIpv4V2(String input) {if (input == null) {return false;}return IP_V4_PATTERN.matcher(input).matches();}

反例:

每次调用时才声明 Pattern。

    private static final String IP_V4 = "^(((\\d)|([1-9]\\d)|(1\\d{2})|(2[0-4]\\d)|(25[0-5]))\\.){3}((\\d)|([1-9]\\d)|(1\\d{2})|(2[0-4]\\d)|(25[0-5]))$";public static boolean isValidIpv4V1(String input) {if (input == null) {return false;}Pattern pattern = Pattern.compile(IP_V4);return pattern.matcher(input).matches();}

测试代码:

package com.ysx.utils.pattern.performance;import org.junit.jupiter.api.Test;import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;/*** @author youngbear* @email youngbear@aliyun.com* @date 2023-09-17 8:31* @blog <a href="https://blog.csdn.net/next_second">...</a>* @github <a href="https://github.com/YoungBear">...</a>* @description 正则表达式性能测试*/
public class PrecompilePerformanceTest {private static final String IP_V4 = "^(((\\d)|([1-9]\\d)|(1\\d{2})|(2[0-4]\\d)|(25[0-5]))\\.){3}((\\d)|([1-9]\\d)|(1\\d{2})|(2[0-4]\\d)|(25[0-5]))$";// Pattern 常量private static final Pattern IP_V4_PATTERN = Pattern.compile(IP_V4);// 缓存private static final Map<String, Pattern> cacheCompilePatternMap = new ConcurrentHashMap<>();public static boolean isValidIpv4V1(String input) {if (input == null) {return false;}Pattern pattern = Pattern.compile(IP_V4);return pattern.matcher(input).matches();}public static boolean isValidIpv4V2(String input) {if (input == null) {return false;}return IP_V4_PATTERN.matcher(input).matches();}public static boolean isValidIpv4V3(String input) {if (input == null) {return false;}if (!cacheCompilePatternMap.containsKey(IP_V4)) {cacheCompilePatternMap.put(IP_V4, Pattern.compile(IP_V4));}Pattern pattern = cacheCompilePatternMap.get(IP_V4);return pattern.matcher(input).matches();}@Testpublic void performanceTest() {String input1 = "192.168.12.13";long start = System.currentTimeMillis();for (int i = 0; i < 10000; i++) {isValidIpv4V1(input1);}long stop = System.currentTimeMillis();System.out.println("isValidIpv4V1, input1, consume: " + (stop - start) + "ms");String input2 = "192.168.12.13";long start2 = System.currentTimeMillis();for (int i = 0; i < 10000; i++) {isValidIpv4V1(input2);}long stop2 = System.currentTimeMillis();System.out.println("isValidIpv4V1, input2, consume: " + (stop2 - start2) + "ms");}@Testpublic void performanceV2Test() {String input1 = "192.168.12.13";long start = System.currentTimeMillis();for (int i = 0; i < 10000; i++) {isValidIpv4V2(input1);}long stop = System.currentTimeMillis();System.out.println("isValidIpv4V2, input1, consume: " + (stop - start) + "ms");String input2 = "192.168.12.13";long start2 = System.currentTimeMillis();for (int i = 0; i < 10000; i++) {isValidIpv4V2(input2);}long stop2 = System.currentTimeMillis();System.out.println("isValidIpv4V2, input2, consume: " + (stop2 - start2) + "ms");}@Testpublic void performanceV3Test() {String input1 = "192.168.12.13";long start = System.currentTimeMillis();for (int i = 0; i < 10000; i++) {isValidIpv4V3(input1);}long stop = System.currentTimeMillis();System.out.println("isValidIpv4V3, input1, consume: " + (stop - start) + "ms");String input2 = "192.168.12.13";long start2 = System.currentTimeMillis();for (int i = 0; i < 10000; i++) {isValidIpv4V3(input2);}long stop2 = System.currentTimeMillis();System.out.println("isValidIpv4V3, input2, consume: " + (stop2 - start2) + "ms");}}

执行结果:

isValidIpv4V1, input1, consume: 232ms
isValidIpv4V1, input2, consume: 74ms
isValidIpv4V2, input1, consume: 24ms
isValidIpv4V2, input2, consume: 19ms
isValidIpv4V3, input1, consume: 20ms
isValidIpv4V3, input2, consume: 12ms

根据执行结果,可以明显看到,预编译正则表达式可以提升性能。

总结

  • 通常情况下,正则表达式为常量,所以可以将其作为常量量,在类编译时预编译。 private static final Pattern xxx_PATTERN = Pattern.compile("xxx");
  • 对于动态的正则表达式,可以将其缓存,即缓存其 Pattern 结果。(参考 isValidIpv4V3 )。
  • 另外,对于外部收入的正则表达式,一定要校验其安全性,防止 ReDos 攻击。
http://www.yayakq.cn/news/698025/

相关文章:

  • 厦门市建设质量安全协会网站江苏省 建设 注册中心网站首页
  • 网站设计培训费用是多少河北邢台手机网站建设
  • 投票网站开发的背景和意义网页游戏网站建设
  • 吴兴网站建设加猛挣钱免费做网站软件
  • 大连网站建设开源wordpress上传图片占空间
  • 网络运维app秦皇岛视频优化推广
  • 帝国建站模板wordpress 主题全屏
  • 昆明市城市基本建设档案馆网站织梦5.7cms照明灯具能源电子产品企业网站源码企业模板带后台
  • 个人网页上传网站怎么做儿童可以做的游戏视频网站
  • 如何快速优化网站网站流量如何转化为钱
  • 哈尔滨网络搭建seo关键词排名怎么优化
  • 做设计常用的网站乌克兰最新消息今天
  • 外贸营销网站珠海手机网站制作
  • 做慕课的网站福州市交通建设集团有限公司网站
  • 整屏网站模板广州建设企业网站公司
  • 公司网站建设前期方案这样做微信网站
  • 电子商务网站建设和管理的意义转化率的网站设计
  • 快站淘客中转页居众装饰集团有限公司
  • 销售平台网站建设商城系统有哪些
  • 属于网络营销站点推广的是正规的高端网站制作公司
  • 上传到网站的根目录中公司门户网站建设特点
  • 做设计找素材都有什么网站培训网站完整页面
  • 域名跳转网站页面设计公司招聘
  • 建设银行的官方网站纪念币网站改版意义
  • 哪儿能做网站建设做旅行社业务的网站都有哪些
  • 电子厂网站建设方案书怎么写网站站群怎么做
  • 网站建设模板怎么设计江苏省品牌专业建设网站
  • wordpress 免费个人主题企业网站seo关键词优化排名思路
  • 做网站微信公众号2817网站
  • 可以在视频网站上做新闻节目吗互动营销网站