У меня есть файл журнала, который состоит из 400k строк журнала.
Я обнаружил, что мой код на С ++ очень медленный по сравнению с кодом на Perl.
Поэтому я сделал простую итерацию по своему лог-файлу и использовал регулярные выражения 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
Поэтому я использовал библиотеку chrono в c ++, чтобы узнать, сколько времени уходит на это. Ниже приведен результат вывода. Я взял образец файла журнала, чтобы все было легко.
Просто читая лог-файл и считая нет. строк занимает 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