我有一个日志文件,其中包含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
答案 0 :(得分:0)
使用re2c或ragel之类的代码生成器工具将您的正则表达式编译为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尚未针对性能进行优化和优化。