I по сравнению с библиотекой регулярных выражений Linux C,Почему C++ 11 regex (реализация libC++) настолько медленная?
#include <iostream>
#include <chrono>
#include <regex.h>
int main()
{
const int count = 100000;
regex_t exp;
int rv = regcomp(&exp, R"_(([a-zA-Z][a-zA-Z0-9]*)://([^ /]+)(/[^ ]*)?)_", REG_EXTENDED);
if (rv != 0) {
std::cout << "regcomp failed with " << rv << std::endl;
}
auto start = std::chrono::high_resolution_clock::now();
for (int i = 0; i < count; i++)
{
regmatch_t match;
const char *sz = "http://www.abc.com";
if (regexec(&exp, sz, 1, &match, 0) == 0) {
// std::cout << sz << " matches characters " << match.rm_so << " - " << match.rm_eo << std::endl;
} else {
// std::cout << sz << " does not match" << std::endl;
}
}
auto end = std::chrono::high_resolution_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
std::cout << elapsed.count() << std::endl;
return 0;
}
В результате примерно 60-70 миллисекунд на моей испытательной машине.
Тогда я использовал библиотеку LIBC++ 'ы,
#include <iostream>
#include <chrono>
#include <regex>
int main()
{
const int count = 100000;
std::regex rgx(R"_(([a-zA-Z][a-zA-Z0-9]*)://([^ /]+)(/[^ ]*)?)_", std::regex_constants::extended);
auto start = std::chrono::high_resolution_clock::now();
for (int i = 0; i < count; i++)
{
std::cmatch match;
const char sz[] = "http://www.abc.com";
if (regex_search(sz, match, rgx)) {
} else {
}
}
auto end = std::chrono::high_resolution_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
std::cout << "regex_search: " << elapsed.count() << std::endl;
start = std::chrono::high_resolution_clock::now();
for (int i = 0; i < count; i++)
{
const char sz[] = "http://www.abc.com";
if (regex_match(sz, rgx)) {
} else {
}
}
end = std::chrono::high_resolution_clock::now();
elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
std::cout << "regex_match: " << elapsed.count() << std::endl;
return 0;
}
В результате примерно 2 секунды для обоих regex_search & алгоритма regex_match. Это примерно в 30 раз медленнее, чем в библиотеке regex.h.
Есть ли что-то не так с моим сравнением? Является ли библиотека регулярных выражений C++ не подходящей для случая высокой производительности?
Я могу понять, что он медленный, потому что в библиотеке регулярных выражений C++ нет оптимизации, но в 30 раз медленнее это слишком много.
Спасибо.
Привет всем,
Спасибо за ответы.
Извините за свою ошибку. Я использовал [] для C, но позже я изменил и забыл изменить код на C++.
Я сделал два изменения,
- я переехал сопзЬ символ SZ [] из петли как для C & C++.
- Я скомпилировал его с -O2 (раньше я не использовал какую-либо оптимизацию), реализация библиотеки C по-прежнему составляет около 60 миллисекунд, но теперь регулярное выражение libC++ дает число: 1 секунда для regex_search и 150 миллисекунд для regex_match.
Это все еще немного медленно, но не так, как оригинальное сравнение.
Ну, во-вторых, вы копируете массив символов каждый раз, если только он не оптимизирован (вряд ли без оптимизации). Во-первых, вы просто указываете на что-то. Вы также должны построить 'std :: string' для вызовов во втором. – chris
Версия компилятора? Точный выход? –
В прошлый раз, когда я пытался, реализация libge ++ regex была действительно медленной, проверьте этот вопрос для сравнения с boost :: regex и python: http://stackoverflow.com/questions/14205096 –