Perl中的C ++ regex_search与regex匹配

时间:2018-10-31 18:55:51

标签: c++ regex perl

我有一个日志文件,其中包含40万条日志行。 我发现,与perl代码相比,我的c ++代码非常慢。 因此,我对日志文件进行了简单的迭代,并使用了c ++和perl的正则表达式。 Perl脚本的执行速度非常快,而c ++则需要时间。

在c ++中,我正在使用#include<regex>库。而在perl中,可以直接使用正则表达式。 如何使c ++代码与perl一样高效?由于perl的实现仅由C实现。

regex log_line("(\\d{1,2}\\/[A-Za-z]{3}\\/\\d{1,4}):(\\d{1,2}:\\d{1,2}:\\d{1,2}).*?\".*?[\\s]+(.*?)[\\s\?].*?\"[\\s]+([\\d]{3})[\\s]+(\\d+)[\\s]+\"(.*?)\"[\\s]+\"(.*?)\"[\\s]+(\\d+)");
string line;
int count =0;
smatch match;
while(getline(logFileHandle, line){
    if(regex_search(line , match , log_line)==true){
    count++
}


open(N==LOG_FILE,"<$log_file_location");
        my $count=0;
        while($thisLine = <=LOG_FILE>){
            if((($datePart, $time, $requestUrl, $status, $bytesDelivered, $httpReferer, $httpUserAgent, $requestReceived) = $thisLine =~ /(\d{1,2}\/[A-Za-z]{3}\/\d{1,4}):(\d{1,2}:\d{1,2}:\d{1,2}).*?\".*?[\s]+(.*?)[\s\?].*?\"[\s]+([\d]{3})[\s]+(\d+)[\s]+\"(.*?)\"[\s]+\"(.*?)\"[\s]+(\d+)/o) == 8){
                $count++;
            }
        }

如果我的问题格式不正确或缺少某些内容,请告诉我。谢谢。

编辑1 因此,我在c ++中使用了 chrono 库来查找花费的时间。以下是输出结果。为了方便起见,我抽取了一个日志文件样本。 只需读取日志文件并计数即可。行需要57毫秒。使用regex_search时,相同的示例日志文件要花费2462毫秒。

No of Lines27399
With regex + logfileRead
Time taken by function: 2462 milliseconds
No of Lines27399
With just simple logfileRead
Time taken by function: 57 milliseconds

2 个答案:

答案 0 :(得分:0)

使用re2cragel之类的代码生成器工具将您的正则表达式编译为C / C ++代码(可由编译器优化)。

或者,Boost.Regex(这是std :: regex的基础)可能比std :: regex的实现要快。

此外,瓶颈可能是I / O而不是正则表达式。 Why is reading lines from stdin much slower in C++ than Python?

答案 1 :(得分:0)

在使用boost :: regex c ++代码时,它像喷气飞机一样飞翔。 std :: regex尚未针对性能进行优化和优化。