C ++ regex_search против соответствия регулярным выражениям в perl - PullRequest
0 голосов
/ 31 октября 2018

У меня есть файл журнала, который состоит из 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

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

При использовании boost :: regex c ++ код вылетает как струя. Std :: regex не оптимизирован и сделан для производительности.

0 голосов
/ 01 ноября 2018

Используйте инструмент генератора кода, такой как re2c или ragel , чтобы скомпилировать ваше регулярное выражение в код C / C ++ (который может быть оптимизирован компилятором).

В качестве альтернативы, Boost.Regex - который был основой для std :: regex - может быть быстрее, чем ваша реализация std :: regex.

Кроме того, узким местом может быть ввод-вывод, а не регулярные выражения. Почему чтение строк из стандартного ввода в C ++ намного медленнее, чем в Python?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...