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 1024
 
int 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 1024
 
int 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域名验证时的性能对比的更多相关文章

  1. HashMap遍历时的性能对比

    使用KeySet和EntrySet遍历的差别 public static void main(String[] args) { HashMap<Integer, Integer> hasM ...

  2. PHP 使用 curl_* 系列函数和 curl_multi_* 系列函数进行多接口调用时的性能对比

    在页面中调用的服务较多时,使用并行方式,即使用 curl_multi_* 系列函数耗时要小于 curl_* 系列函数. 测试环境 操作系统:Windows x64 Server:Apache PHP: ...

  3. 全面了解移动端DNS域名劫持等杂症:原理、根源、HttpDNS解决方案等

      1.引言 对于互联网,域名是访问的第一跳,而这一跳很多时候会“失足”(尤其是移动端网络),导致访问错误内容.失败连接等,让用户在互联网上畅游的爽快瞬间消失. 而对于这关键的第一跳,包括鹅厂在内的国 ...

  4. DNS域名配置

    1.什么是DNS 2.DNS层次介绍及基础内容 3.DNS的工作原理及过程 域名服务器配置实战:    4.主域名服务器配置     5.辅域名服务器配置     6.缓存域名服务器配置 1.什么是D ...

  5. 使用POSIX正则库匹配一行中多个结果

    正则匹配与正则表达式是什么东西我就不说了,在这里说下POSIX这个c语言正则库在对字符串进行正则匹配时取出多个结果的问题. 首先简单说明下POSIX正则库的几个函数和使用方法 第一个函数:int re ...

  6. 【归纳】正则表达式及Python中的正则库

    正则表达式 正则表达式30分钟入门教程 runoob正则式教程 正则表达式练习题集(附答案) 元字符\b代表单词的分界处,在英文中指空格,标点符号或换行 例子:\bhi\b可以用来匹配hi这个单词,且 ...

  7. DNS域名记录

    DNS域名记录 DNS数据库 在DNS的解析过程中用到域名的解析资源的记录,这个解析记录在DNS当中称为DNS数据库. 这个数据库又分为正解和反解,正解就是从主机名到ip的过程,反解就是从ip反响解析 ...

  8. DNS域名工作原理及解析

    0x00 定义 DNS( Domain Name System)是“域名系统”的英文缩写,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网.DNS使用TCP和UDP端口53 ...

  9. 浅谈,seata在使用feign-url通过域名调用时分布式事务不生效的问题及解决

    浅谈,seata在使用feign-url通过域名调用时分布式事务不生效的问题及解决 ​ 在前几个月时,我们项目出现了分布式事务的问题,那么什么是分布式事务问题呢,简单的说,我们有俩服务A和B,它们对应 ...

随机推荐

  1. CodeForces Round#313

    第一题想当然了,结果被坑.. 有1的肯定能构成所有的其他数,没有1的肯定构不成1 ,这题T T #include <iostream> #include <cstring> # ...

  2. pip安装模块

    需要到pip目录下执行 pip install 模块名 pip 也需要配置环境变量,电脑是windows

  3. Dijkstra算法初步 - 迷宫问题

    你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数.还有若干双向道路连结这些房间,你沿着这些道路从一个房间走到另外一个房间需要一些时间.游戏规定了 ...

  4. 单元测试地二蛋 先弄个两个原生模块1个原始的一个jq插件

    放羊测试测完了再测这两个瞎搞的下拉列表组建 看看从单元测试模块化的角度组建会写成啥样 1:ajax请求 简单文本     2:1个页面多个实例     3:复杂展示+自定义点击+自定义处理函数     ...

  5. MySQL:索引工作原理

    索引查找:通过索引键找到索引的叶子节点,再通过叶子节点的标记快速找到表中对应的行数据,再返回指定的列 索引找查是通过索引键定先位到一块局部区域,再开始扫描匹配的数据的. 为什么需要索引(Why is ...

  6. BZOJ3687 计算子集和的异或和

    题不知道怎么不见了,bzoj上已经没了3687这题了 题意:给你一个n 然后输入n个数 求这n个数的所有子集的和的异或和 思路:用bitset记录某个数是否在子集和中出现,利用bitset对二进制位的 ...

  7. 02.JavaScript基础下

    运算符 算术:+ 加.- 减.* 乘./ 除.% 取模 实例:隔行变色.秒转时间 赋值:=.+=.-=.*=./=.%= 关系:<.>.<=.>=.==.===.!=(不等). ...

  8. MySQL时间戳相互转换

    mysql将时间戳转成常用时间格式 在mysql中,一个时间字段的存储类型是int(11),怎么转化成字符类型,比方存储为13270655222,需要转化为yyyy -mm-dd的形式. 使用 FRO ...

  9. C# 程序实现功能目录

    1.根据年月日获取 星期几  http://www.cnblogs.com/liwp/p/5943226.html 2.json对象转换为泛型集合 http://www.cnblogs.com/liw ...

  10. NC57,NC63-NC二开经验总结

    版主2010级市场营销专业本科生 2013年8月入达内培训Java相关技术 12月入职,做用友NC的二次开发工作 2015年4月离职,4中下旬入职一家互联网金融企业 下面是做NC二开期间积累的一些常用 ...