c++与perl在正则表达式运算速度上的比较

写了两组代码文件,组内代码功能相同:

testv.pl vs testv.cpp

testreg.pl vs testreg.cpp

代码如下:

////////testreg.cpp/////////
#include<iostream>
#include<fstream>
#include<regex>
using namespace std;
int main(int argv, char ** argc)
{
    fstream in(argc[1], fstream::in);
    int line_count;
    string line_content;
    regex reg("[ATCG]");
    while(getline(in, line_content))
    {
        line_count++;
        if(line_count % 4 == 2)
        {
            if(regex_search(line_content, reg))
            {
                cout<<1<<endl;
            }
        }
    }
    return 0;
}
////////testreg.pl/////////
#!/usr/bin/perl
use strict;
use 5.010;
my $file = shift;
open SEQ, ‘<‘, $file or die "$!";
while(<SEQ>) {
        chomp;
        if($. % 4 == 2) {
        if(/[ATCG]/) {
            say 1;
        }
    }
}
////////testv.cpp/////////
#include<iostream>
#include<fstream>
#include<unordered_map>
using namespace std;
int main(int argv, char ** argc)
{
    fstream in(argc[1], fstream::in);
    int line_count;
    string line_content;
    typedef unordered_map<string, int> mapdef;
    mapdef mymap;
    while(getline(in, line_content))
    {
        line_count++;
        if(line_count % 4 == 2)
        {
            mymap[line_content]++;
        }
    }
    cout<<mymap.size()<<endl;
    return 0;
}
////////testv.pl/////////
#!/usr/bin/perl

use strict;
use 5.010;

my $file = shift;
open SEQ, ‘<‘, $file or die "$!";
my %hash;
while(<SEQ>) {
    chomp;
    if($. % 4 == 2) {
        $hash{$_}++;
    }
}
say scalar(keys %hash);

使用shell命令,计算运行时间,结果如下:

time perl testv.pl Input

time ./a.out Input

time perl testreg.pl Input | wc -l

time ./a.out Input | wc -l

  real user sys  
testv.pl 0m0.141s 0m0.121s 0m0.011s  
testv.cpp 0m0.077s 0m0.054s 0m0.012s  
testreg.pl 0m0.142s 0m0.122s 0m0.006s  
testreg.cpp 0m0.251s 0m0.104s 0m0.137s  

其中,Input是fastq文件,含有54914DNA序列。

可以看出在涉及正则表达式运算时, c++明显不占优势,要卡一两面才输出结果

时间: 2024-10-08 09:36:18

c++与perl在正则表达式运算速度上的比较的相关文章

Perl入门(四)Perl的正则表达式

正则表达式是Perl语言的特色,基本的语法不是很难,但是编写一个符合需求.高效的正则表达式,还是有一些挑战的. Perl的三种匹配模式 1.查找 语法:m/正则表达式内容/; 作用:查找匹配内容中是否包含"正则表达式内容",如果包含返回1,否则返回0: #!user/bin/env perl -w #1... $str1 = "i like perl"; $result1 = ($str1 =~ m/perl/); print "$result1 $str

正则表达式(上)

内容提纲: 1.什么是正则表达式 2.创建正则表达式  转载请注明出处,谢谢! 假设用户需要在HTML表单中填写姓名.地址.出生日期等.那么在将表单提交到服务器进一步处理前,JavaScript程序会检查表单以确认用户确实输入了信息并且这些信息是符合要求的.这时候就需要用到正则表达式. 一.什么是正则表达式 正则表达式(regular expression)是一个描述字符模式的对象.ECMAScript的RegExp类表示正则表达式,而String和RegExp都定义了使用正则表达式进行强大的模

PHP -- Perl风格正则表达式

1.正则表达式作为一个匹配的模版,是由原子(普通字符,例如a-z),有特殊功能的字符(元字符,例如*.+ 和?等),以及模式修正符三个部分组成.2.在于Perl兼容的正则表达式函数中使用模式时一定要给模式加上定界符,即将模式包含再两个反斜线  /  之间 . 一.定界符再使用Perl兼容的正则表达式时,要将模式表达式放进定界符之间.作为定界符不仅仅局限使用"/",除了数字.字符.和反斜线\意外的任何字符都可以作为定界符号.不过通常都习惯讲模式表达式包含在两个斜线/之间. 二.原子原子是

半小时学会正则表达式(上)

正则表达式(Regular Expression)在代码中常常简写为regex.正则表达式通常被用来检索.替换那些符合某个规则的文本,它是一种强大而灵活的文本处理工具. 正则描述了一个规则,通过这个规则可以匹配一类字符串. 如何学习正则? 1.学习正则表达式的语法规则 2.练习使用正则并能解决实际问题 针对上面的每个点我会分别写一篇文章来说明,用最短的时间学会正则表达式. 这篇文章讲述正则表达式的语法和使用说明,让你半小时学会正则表达式. 学习正则表达式语法,主要就是学习元字符以及它们在正则表达

javaScript正则表达式(上)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka           摘要:一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式.该模式描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配. 一.什么是正则表达式? 1.正则表达式可以: ? 测试字符串的某个模式.例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡

Perl之正则表达式--模式匹配

大家用过unix或者linux系统,对vi,sed,grep,awk等使用工具不会陌生,应该了解用于定界符搜索模式的正则表达式和元字符.那么什么是正则表达式呢?正则表达式是一种序列或者字符模式,负责在搜索或者替换文本时对文本内容进行字符串匹配.简单的正则表达式直接由待匹配字符串或字符集构成. 正则表达式一般以斜杠(/)做界定符.实际上任何字符串都可以成为界定符.例如:/abc/, ?abc? 表达式修饰符与简单语句 常见修饰符:if  unless while  until foreach if

perl 之 正则表达式 (简)

正则表达式,简单介绍: 元字符 匹配项 字符类:单字符与数字   . 匹配除换行符之外的任意字符 [a-z0-9] 匹配集中任意单字符 [^a-z0-9] 匹配不在集合中的任意单字符 \d 匹配单个数字 \D 匹配非数字字符,等效于[^0-9] \w 匹配数字型的(字)字符 \W 匹配非数字型的(非字)字符 字符类:空白字符   \s 匹配空白字符,如空格.制表符和换行符 \S 匹配非空白字符 \n 匹配换行符 \r 匹配回车符 \t 匹配制表符 \f 匹配进纸符 \b 匹配退格符 \0 匹配空

正则表达式工具(上)

grep 1)查找特定字符 -n 显示行号 -i 不区分大小写 -v 反向查找 2)利用中括号"[]"来查找集合字符 3)查找行首"^"与行尾字符"$" *4)查找任意一个字符"."与重复字符""** 5)查找连续字符范围"{}" egrep 常见元字符如下 作用:重复一个或者一个以上的前一个字符 ? 作用:零个或者一个的前一个字符 | 作用:使用或者(or)的方式找出多个字符 () 作

正则表达式举例(上)

语法 作用 ^ 行首 $ 行尾 ^[the] 以the开头行 [Ss]ignal[lL] 匹配单词signal,signaL,Signal,SignaL [Ss]ignal[lL]\. 同上,但加一句点 [mayMAY] 包含may大写或小写字母的行 ^USER$ 只包含USER的行 [tty]$ 以tty结尾的行 \. 带句点的行 ^d..x..x..x 对用户,用户组及其他用户组成员有可执行权限的目录 ^[^l] 排除关联目录的目录列表 [.*0] 0之前或之后加任意字符 [000*] 00