Java中正则匹配性能测试
工作中经常会用到在文本中每行检索某种pattern,刚才测试了三种方式,发现实际性能和预想的有区别
方式1:
直接字符串的matches方法,【string.matches("\\d+")】
方式2:
先构建一个单行匹配的pattern,然后用这个pattern去match
Pattern p1=Pattern.compile("\\d+");
Matcher m=p1.matcher(sar[i]);
方式3:
构建一个可以匹配换行符DOTALL模式的pattern,然后在整个文本中find
Pattern p2=Pattern.compile("\\d+",Pattern.DOTALL );
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class TestRe { /**
* @param args
*/
public static void main(String[] args) {
String s1="abc";
String s2="123";
//构建一个多行的字符串
StringBuilder stb=new StringBuilder();
for(int i=0;i<10000;i++){
int k=new Random().nextInt()%2;
if(k==0){
stb.append(s1+"\n");
}
else{
stb.append(s2+"\n");
}
} Pattern p2=Pattern.compile("\\d+",Pattern.DOTALL );
Pattern p1=Pattern.compile("\\d+");
String ts=stb.toString();
String[] sar=ts.split("\n");
test1(sar);
test2(ts,p2);
test3(sar,p1); } public static void test1(String[] sar){
long st=System.nanoTime();
List<String> l=new ArrayList<String>();
for(int i=0;i<sar.length;i++){
if(sar[i].matches("\\d+")){
l.add(sar[i]);
}
}
System.out.println("1Size"+l.size());
long et=System.nanoTime();
System.out.println("test1:"+(et-st)+"纳秒");
} public static void test3(String[] sar,Pattern p1){
long st=System.nanoTime();
List<String> l=new ArrayList<String>();
for(int i=0;i<sar.length;i++){
Matcher m=p1.matcher(sar[i]);
if(m.matches()){
l.add(sar[i]);
}
}
System.out.println("3Size"+l.size());
long et=System.nanoTime();
System.out.println("test3:"+(et-st)+"纳秒");
} public static void test2(String s,Pattern p){
long st=System.nanoTime();
List<String> l=new ArrayList<String>();
Matcher m=p.matcher(s);
while(m.find()){
l.add(m.group());
}
System.out.println("2Size"+l.size());
long et=System.nanoTime();
System.out.println("test2:"+(et-st)+"纳秒");
} }
下
面是运行结果,方法一竟然性能最低,在很简单的正则表达式或者不需要替换,不需要找出子匹配时,这个方法是我用的最多的,想不到性能最差。
测试一:
1Size4999
test1:53153038纳秒
2Size4999
test2:13393716纳秒
3Size4999
test3:4527045纳秒
测试二:
1Size4941
test1:38807545纳秒
2Size4941
test2:6826025纳秒
3Size4941
test3:3127127纳秒
看起来好像是方法三优于方法二,实则不然,如果把调用次序换下,方法二有会快于方法三,我的猜想是底层调用可能有单例对象什么的。先调用的pattern可能被复用。没做调查
调换后的结果:
测试一:
2Size5093
test2:12792156纳秒
3Size5093
test3:13665544纳秒
1Size5093
test1:56139648纳秒
测试二:
2Size4952
test2:12030397纳秒
3Size4952
test3:20046193纳秒
1Size4952
test1:40124475纳秒
Java中正则匹配性能测试的更多相关文章
- JS中正则匹配的三个方法match exec test的用法
javascript中正则匹配有3个方法,match,exec,test: match是字符串的一个方法,接收一个RegExp对象做为参数: match() 方法可在字符串内检索指定的值,或找到一个或 ...
- 关于php中正则匹配包括换行符在内的任意字符的问题总结
要使用正则匹配任意字符的话,通常有以下几种方法,这里我分别对每一种方法在使用的过程中做一个总结: 第一种方式:[.\n]*? 示例 ? PHP preg_match_all('/<div cla ...
- Python中正则匹配使用findall时的注意事项
在使用正则搜索内容时遇到一个小坑,百度搜了一下,遇到这个坑的还不少,特此记录一下. 比如说有一个字符串 "123@qq.comaaa@163.combbb@126.comasdf111@a ...
- Python中正则匹配使用findall,捕获分组(xxx)和非捕获分组(?:xxx)的差异
转自:https://blog.csdn.net/qq_42739440/article/details/81117919 下面是我在用findall匹配字符串时遇到的一个坑,分享出来供大家跳坑. 例 ...
- html中正则匹配img
1.正则匹配html中的img标签,取出img的url并进行图片文件下载: /// <summary> /// 将image标签的src属性的url替换为base64 /// </s ...
- python中正则匹配之re模块
Python中正则表达式 re:re是提供正则表达式匹配操作的模块 一.什么是正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某个模式匹配,Python 自1.5版本起 ...
- java 中 正则 正则表达式 匹配 url
不多说 [http|https]+[://]+[0-9A-Za-z:/[-]_#[?][=][.][&]]* 这个就是匹配 网络上的网址 又称 url . 最起码 绝大部分的taobao ur ...
- JavaScript 中正则匹配时结果不一致的问题
创建示例项目 考察如下场景,我们有个输入框组件,输入时同时进行校验. interface IInputProps { label: string; } function Input({ label } ...
- Java中正则Matcher类的matches()、lookAt()和find()的区别
在Matcher类中有matches.lookingAt和find都是匹配目标的方法,但容易混淆,整理它们的区别如下: matches:整个匹配,只有整个字符序列完全匹配成功,才返回True,否则返回 ...
随机推荐
- In 和Exists
1.exist,not exist一般都是与子查询一起使用. In可以与子查询一起使用,也可以直接in (a,b.....) 2.exist会针对子查询的表使用索引. not exist会对主子查询都 ...
- request.get_full_path() 和request.path区别
1. 都是获取request 请求的url路径 2. request.get_full_path() -- 获取当前url,(包含参数) 请求一个http://127.0.0.1:8000/200/? ...
- QT学习笔记6:常见的 QGraphicsItem
简述 QGraphicsItem 类是 QGraphicsScene 中所有 item 的基类. 它提供了一个轻量级的基础,用于编写自定义 item.其中包括:定义 item 的几何形状.碰撞检测.绘 ...
- [BZOJ5298][CQOI2018]交错序列(DP+矩阵乘法)
https://blog.csdn.net/dream_maker_yk/article/details/80377490 斯特林数有时并没有用. #include<cstdio> #in ...
- CVE-2014-4113本地提权测试
CVE-2014-4113本地提权漏洞分析 By Netfairy 前言 2014年10月14日, Crowdstrike和FireEye发表了一篇文章, 描述了一个新的针对Windows的提权漏洞. ...
- Android ContentObserver详解
前言: 工作中,需要开启一个线程大量的查询某个数据库值发送了变化,导致的开销很大,后来在老大的指点下,利用了ContentObserver完美的解决了该问题,感到很兴奋,做完之后自己也对Content ...
- String 字符串详解 / 常用API
String 详解 / 常用API 简介 String 是不可改变的字符串序列.String 为字符串常量 StringBuilder 与StringBuffer 均为可改变的字符串序列.为字符串变量 ...
- Java输入输出入门 A+B
描述 求两个整数之和. 输入 输入数据只包括两个整数A和B. 输出 两个整数的和. 样例输入 1 2 样例输出 3 import java.util.Scanner; public class Mai ...
- 使用BasicDataSource引发的数据库连接中断的问题和解决方法
http://blog.csdn.net/itbasketplayer/article/details/44198963 http://blog.sina.com.cn/s/blog_9e3e5499 ...
- Python168的学习笔记5
关于对csv文件的操作. python标准库中有csv的库,使用非常方便. import csv with open('pingan.csv','rb') as rf: reader = csv.re ...