Почему std::regex такой медленный?

232
04 февраля 2019, 04:20

Попробую написать регулярное выражение, которое будет разбивать строку на отдельные слова. Написал такой код:

std::string str {"words alpha beta gamma delta and my head one two free four five "};
const std::regex reg{ ".+?\\s" };
std::smatch result;
auto begin = str.cbegin();
std::chrono::time_point<std::chrono::high_resolution_clock> t{ std::chrono::high_resolution_clock::now() };
while (std::regex_search(begin, str.cend(), result, reg)) {
    begin += result.length();
    std::cout << result.str();
};
std::cout <<"time: " << std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::high_resolution_clock::now() - t).count() << endl;

Но по какой-то причине этот код работает невероятно медленно. На компиляторе MVC выполнение while занимает почти 3 мс в отладочном режиме и чуть меньше с оптимизацией. При запуске на одном онлайн сервисе выполнение этого кода занимает 2100 мс. Проблема в моём коде или регулярные выражения сами по себе такие медленные? Как можно это ускорить?

READ ALSO
Рандомное число в промежутке A и B

Рандомное число в промежутке A и B

Написал программу в которой пользователь может задать числа А и В

237
Цикл с локатором

Цикл с локатором

Имею таблицу формата:

295
Регулярное выражение много строчное

Регулярное выражение много строчное

Здравствуй сообщество есть вот такая строка и регулярное выражение:

267
Selenium, Java: выбрать элемент выпадающего списка, если на странице он представлен одновременно select и ul li, и Selenium не видит их оба

Selenium, Java: выбрать элемент выпадающего списка, если на странице он представлен одновременно select и ul li, и Selenium не видит их оба

Использую Selenium, javaЗадача: получить список элементов для двух выпадающих списков и кликнуть на один из полученных элементов в обоих списках

463