C正则库做DNS域名验证时的性能对比
C正则库做DNS域名验证时的性能对比
本文对C的正则库regex和pcre在做域名验证的场景下做评测。
验证DNS域名的正则表达式为:
"^[0-9a-zA-Z_-]+(\\.[0-9a-zA-Z_-]+)*(\\.[a-zA-Z]{2,}\\.)$"
对于正常DNS请求日志中的6177578条日志做正则验证处理。
1,pcre
评测所用的pcre的版本号是:7.8.3
|
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
|
#include <stdio.h>#include <string.h>#include <pcre.h>#define OVECCOUNT 30 /* should be a multiple of 3 */#define EBUFLEN 128#define BUFLEN 1024int main(int argc, char *argv[]){ pcre *re; const char *error; int erroffset; FILE *fd; int ovector[OVECCOUNT]; int rc, i; int succ = 0, fail = 0; char src[1024]; char pattern[] = "^[0-9a-zA-Z_-]+(\\.[0-9a-zA-Z_-]+)*(\\.[a-zA-Z]{2,}\\.)$"; printf("Pattern: %s\n", pattern); re = pcre_compile(pattern, 0, &error, &erroffset, NULL); if (re == NULL) { printf("PCRE compilation failed at offset %d: %s\n", erroffset, error); return 1; } if ((fd = fopen(argv[1], "r")) == NULL) { printf("open file error\n"); return 1; } while(fgets(src, 1024, fd)) { rc = pcre_exec(re, NULL, src, strlen(src), 0, 0, ovector, OVECCOUNT); if (rc < 0) { fail++; } else { succ++; } } printf("success:%d fail:%d\n", succ, fail); fclose(fd); free(re); return 0;} |
处理完所有数据的耗时是:
$time ./pcre_t query_domains
Pattern: ^[0-9a-zA-Z_-]+(\.[0-9a-zA-Z_-]+)*(\.[a-zA-Z]{2,}\.)$
success:6177443 fail:135
real 0m8.257s
user 0m8.194s
sys 0m0.058s
2,regex
|
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
|
#include <stdio.h>#include <string.h>#include <regex.h>#define SUBSLEN 100#define EBUFLEN 1280 #define BUFLEN 1024int main(int argc, char *argv[]){ size_t len; regex_t re; regmatch_t subs[SUBSLEN]; char matched[BUFLEN]; char errbuf[EBUFLEN]; int err, i, succ=0, fail=0; FILE *fd; char *src; char line[1024]; char pattern[] = "^[0-9a-zA-Z_-]+(\\.[0-9a-zA-Z_-]+)*(\\.[a-zA-Z]+\\.)$"; printf("Pattern: %s\n", pattern); if(regcomp(&re, pattern, REG_EXTENDED | REG_NEWLINE)) { len = regerror(err, &re, errbuf, sizeof(errbuf)); printf("error: regcomp: %s\n", errbuf); return 1; } if ((fd = fopen(argv[1], "r")) == NULL) { printf("open file error\n"); return 1; } while(fgets(line, 1024, fd)) { err = regexec(&re, line, (size_t) SUBSLEN, subs, 0); if (err == REG_NOMATCH) { fail++; } else { succ++; } } printf("success:%d, fails:%d\n", succ, fail); fclose(fd); regfree(&re); return (0);} |
处理完所有数据耗时:
$time ./regex_t query_domains
Pattern: ^[0-9a-zA-Z_-]+(\.[0-9a-zA-Z_-]+)*(\.[a-zA-Z]+\.)$
success:6177443, fails:135
real 0m50.876s
user 0m50.783s
sys 0m0.058s
3,结论。
可以看到,对于域名验证的场景。pcre明显优于POSIX regex库。在规则已经编译好的情况下,pcre每秒大约处理74.8w条域名,而regex每秒大约处理12.1万条。
C正则库做DNS域名验证时的性能对比的更多相关文章
- HashMap遍历时的性能对比
使用KeySet和EntrySet遍历的差别 public static void main(String[] args) { HashMap<Integer, Integer> hasM ...
- PHP 使用 curl_* 系列函数和 curl_multi_* 系列函数进行多接口调用时的性能对比
在页面中调用的服务较多时,使用并行方式,即使用 curl_multi_* 系列函数耗时要小于 curl_* 系列函数. 测试环境 操作系统:Windows x64 Server:Apache PHP: ...
- 全面了解移动端DNS域名劫持等杂症:原理、根源、HttpDNS解决方案等
1.引言 对于互联网,域名是访问的第一跳,而这一跳很多时候会“失足”(尤其是移动端网络),导致访问错误内容.失败连接等,让用户在互联网上畅游的爽快瞬间消失. 而对于这关键的第一跳,包括鹅厂在内的国 ...
- DNS域名配置
1.什么是DNS 2.DNS层次介绍及基础内容 3.DNS的工作原理及过程 域名服务器配置实战: 4.主域名服务器配置 5.辅域名服务器配置 6.缓存域名服务器配置 1.什么是D ...
- 使用POSIX正则库匹配一行中多个结果
正则匹配与正则表达式是什么东西我就不说了,在这里说下POSIX这个c语言正则库在对字符串进行正则匹配时取出多个结果的问题. 首先简单说明下POSIX正则库的几个函数和使用方法 第一个函数:int re ...
- 【归纳】正则表达式及Python中的正则库
正则表达式 正则表达式30分钟入门教程 runoob正则式教程 正则表达式练习题集(附答案) 元字符\b代表单词的分界处,在英文中指空格,标点符号或换行 例子:\bhi\b可以用来匹配hi这个单词,且 ...
- DNS域名记录
DNS域名记录 DNS数据库 在DNS的解析过程中用到域名的解析资源的记录,这个解析记录在DNS当中称为DNS数据库. 这个数据库又分为正解和反解,正解就是从主机名到ip的过程,反解就是从ip反响解析 ...
- DNS域名工作原理及解析
0x00 定义 DNS( Domain Name System)是“域名系统”的英文缩写,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网.DNS使用TCP和UDP端口53 ...
- 浅谈,seata在使用feign-url通过域名调用时分布式事务不生效的问题及解决
浅谈,seata在使用feign-url通过域名调用时分布式事务不生效的问题及解决 在前几个月时,我们项目出现了分布式事务的问题,那么什么是分布式事务问题呢,简单的说,我们有俩服务A和B,它们对应 ...
随机推荐
- sqlmap的安装方法
1.安装Python2.7,设置Python环境变量
- 浏览器-09 javascript引擎和Chromium网络栈
语言的运行 C/C++语言 使用编译器直接将它们编译成本地代码(机器指令),这是由开发人员在代码编写完成之后实施; 用户只是使用这些编译好的本地代码,这些本地代码被系统的加载器加载执行,由操作系统调度 ...
- oracle存储过程截取字符串
declare CURSOR l_c IS select classid from cjt_class; Begin FOR i IN l_c LOOP update cjt_class t set ...
- pycharm 调试 django 应用
django 应用 2 种调试方法 1 import pdb;pdb.set_trace() 命令行重启应用 2 命令行启动应用, pycharm 中 Tools -> Attach to P ...
- 你应该在开始API开发之前知道的事(下)(翻译)
放了十多天,一直在玩没写,今天终于要把坑填完了.有部分没翻,主要是一般都用不上的,有兴趣的朋友可以自己翻下. 上篇地址 :http://www.cnblogs.com/Scohura/p/357360 ...
- 【听说是线段树】bzoj1012 [JSOI2008]最大数maxnumber
一眼看题目吓了一跳:这TM不就是单调队列吗,200000又怎样,大不了我二分嘛 系统提示:成功开启 手残模式 开始瞎写: #include <cstdio> ]; ]; int m,mod ...
- 【DP】HDU 1176
HDU 1176 免费馅饼 题意:中文题目不解释. 思路:因为是从中间出发所以思路卡了许久,还在之前做了道HIHO入门的题.能想到的点,从时间思考,然后初始化1s的时候,4,5,6,的数值要特别赋值. ...
- MSSQL 跨服器调用存储过程
A库 CREATE PROCEDURE [dbo].[A_P_Test] AS BEGIN SELECT * FROM dbo.A_LoadData END B库 在B中调用A库存储过程 注:是同一 ...
- React简谈
这段时间学习了react.js,在此做个总结. react.js在优势上我认为是两个大点,第一是性能,作者从dom操作实际出发,通过虚拟dom(这里虚拟dom实际上是以jsx格式的语法来预先构建dom ...
- ubuntu下mediawiki的使用
wiki语法确实比较麻烦 终于找到一种简单的方法,LibreOffice可以直接导出为wiki格式 https://apps.ubuntu.com/cat/applications/libreoffi ...