0%

Java正则性能优化

由于最近工作接触到的是kafka es 大数据等类似态势感知的系统

so,这个态势基于log,为了提高性能,用正则去匹配

用到的软件是RegexBuddy 4.9.0

性能优化:其实是看正则最后一段规则错误而匹配时间最短的效率;比如匹配字符串,将正则最后匹配规则改为其他的,看正则匹配时间,时间越短,效率越高。

用法:

1
2
3
4
5
6
7
8
9
界面找到 应用和语言 栏,然后选择 boost::regex 1.66-1.68

然后点击仪表盘标志,选择Side by Side Layout

之后在Whole file下方的输入栏,输入源字符串

之后在左上方的输入栏,输入正则表达式

双击 源字符串,再点 Debug,之后会看到左下方出现了正则的全部回溯

效率验证代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.Date;
import java.util.Arrays;
import java.util.List;
import java.io.File;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.text.DecimalFormat;


class TestClass {
// 按行读取文件
public static void ReadFileByLine(String filename) {
File file = new File(filename);
InputStream is = null;
Reader reader = null;
BufferedReader bufferedReader = null;
String test_str = "asdadasjjdsahfdsjahfkdjsafkjdsafdsafdssadasdasdasda\"\"dsadsadsadsadass}}";
try {
is = new FileInputStream(file);
reader = new InputStreamReader(is);
bufferedReader = new BufferedReader(reader);
String line = null;
System.out.printf("单条匹配数据量为:%d%n", 50000000);
System.out.printf("原始数据:%s%n", test_str);
System.out.printf("%n");
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
Pattern regex = Pattern.compile(line);

Date start_time = new Date(); // 创建线程启动时间

for (int i=1; i<=50000000; i++) {
Matcher regexMatcher = regex.matcher(test_str);

if (regexMatcher.find()) {
// System.out.println(regexMatcher.group());
}
}
Date end_time = new Date(); // 创建线程结束时间

// 获得两个日期之间的秒差
double minu;
minu = (double) Math.round((end_time.getTime()-start_time.getTime())) / 1000;

// 获得两个日期之间的毫秒差
int m_minu =(int) (end_time.getTime()-start_time.getTime());

System.out.printf("当前正则共耗时约:%.2f 秒!%n", minu);
System.out.printf("当前正则共耗时:%d 毫秒!%n", m_minu);
System.out.printf("%n");
}

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (null != bufferedReader)
bufferedReader.close();
if (null != reader)
reader.close();
if (null != is)
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

public static void main(String[] args) {
String filename = "/home/grayad/Desktop/Work/Regex_Scripts/reg_srt.txt";
ReadFileByLine(filename);
}
}

欢迎关注我的其它发布渠道