2015-10-16 4 views
1

У меня есть много файлов размером менее 64 кб, и мне нужно их преобразовать с кодом ниже.regex работает очень медленно

Вот рабочий код в QT с QRegExp.

Я попытался переписать его в MSVC с помощью regex_replace и столкнулся с проблемой очень медленной работы.

интервала QT:

temp.replace(QRegExp("[ ]{0,}(=)[ ]{0,}"), QString("=")); 
temp.replace(QRegExp("[ ]{0,}(==)[ ]{0,}"), QString("==")); 
temp.replace(QRegExp("[ ]{0,}(>)[ ]{0,}"), QString(">")); 
temp.replace(QRegExp("[ ]{0,}(<)[ ]{0,}"), QString("<")); 
temp.replace(QRegExp("[ ]{0,}(\\&\\&)[ ]{0,}"), QString("&&")); 
temp.replace(QRegExp("[ ]{0,}(\\|\\|)[ ]{0,}"), QString("||")); 
temp.replace(QRegExp("[ ]{0,}(\\})[ ]{0,}"), QString("}")); 
temp.replace(QRegExp("[ ]{0,}(\\{)[ ]{0,}"), QString("{")); 

MSVC:

temp = regex_replace(temp, std::regex("[ ]{0,}(=)[ ]{0,}"), "="); 
temp = regex_replace(temp, std::regex("[ ]{0,}(==)[ ]{0,}"), "=="); 
temp = regex_replace(temp, std::regex("[ ]{0,}(>)[ ]{0,}"), ">"); 
temp = regex_replace(temp, std::regex("[ ]{0,}(<)[ ]{0,}"),"<"); 
temp = regex_replace(temp, std::regex("[ ]{0,}(\\&\\&)[ ]{0,}"),"&&"); 
temp = regex_replace(temp, std::regex("[ ]{0,}(\\|\\|)[ ]{0,}"),"||"); 
temp = regex_replace(temp, std::regex("[ ]{0,}(\\})[ ]{0,}"), "}"); 
temp = regex_replace(temp, std::regex("[ ]{0,}(\\{)[ ]{0,}"),"{"); 

Например: std::string темп (размер ~ 18kb) обрабатываются в течение примерно 10 секунд для каждой строки.

Что возможно, не так?

+0

Какая производительность используется вместо 'Qt'? Я имею в виду, один из них намного лучше другого? Из того, что вы написали, не ясно. – skypjack

+0

Вы пробовали простое регулярное выражение, чтобы проверить, не потребляется ли время автореджером regexp или чтением файлов каким-то неудачным способом? – mvw

+0

@skypjack Я не могу сказать точное время выполнения в QT, но это было так быстро, что я не должен был об этом думать. –

ответ

4

Имеющиеся версии std::regex на самом деле не являются уловкой (пока?), Но boost::regex достаточно быстр.

+0

Похоже, что библиотека boost имеет решение по каждой проблеме быстрее и элегантнее, чем std. –

+0

Ну, '' boost :: regex'' был первым. Но мне интересно, почему люди clang/libC++ не основывали свое '' std :: regex'' на 'boost :: regex''. Он работает лучше и имеет разрешительную лицензию. Это означает, что нет оправдания для худшего. – kamikaze

Смежные вопросы