Я работаю над проектом, где производительность имеет решающее значение.
В этом проекте мне также нужно использовать регулярное выражение для сопоставления с шаблоном в массиве символов. Таким образом, я начал использовать boost :: xpressive :: cregex, поскольку мне просто нужно одно регулярное выражение, которое можно скомпилировать один раз.
Вот мой код с xpressive
const boost::xpressive::cregex CCConcealerImpl::kCCRegEx = boost::xpressive::cregex::compile("... my regex...", boost::xpressive::regex_constants::optimize);
Для декларации (статическая декларация)
char * aTempStr = new char[iSize+1];
//Filling my array
aTempStr[iSize] = '\0';
if (boost::xpressive::regex_match(aTempStr, aTempStr + iSize, kCCRegEx))
{
std::cout << "Matched" << std::endl;
}
Для соответствия моего регулярного выражения.
Затем я запустил callgrind, чтобы убедиться в работоспособности этой реализации, а для метода match callgrind возвращает следующее:
2 521 246 300 инструкций для 127 928 звонков.
Для любопытства я также попробовал реализацию boost :: regex:
const boost::regex CCConcealerImpl::kCCRegEx("... my regex...");
Для декларации (статическая декларация)
char * aTempStr = new char[iSize+1];
//Filling my array
aTempStr[iSize] = '\0';
if (boost::regex_match(aTempStr, aTempStr + iSize, kCCRegEx))
{
std::cout << "Matched" << std::endl;
}
Для соответствия моего регулярного выражения.
Но когда я запускаю callgrind здесь, что я получаю:
694 604 660 инструкций для 127 928 звонков.
Это довольно большая разница (регулярное выражение в 3 раза быстрее, чем xpressive … с точно таким же входом), я ожидал такой разницы, но не с этой стороны …
Разве xpressive не должен быть быстрее, чем регулярное выражение?
Может быть, я использую динамическую версию xpressive, в таком случае, как я могу заставить xpressive быть статическим?
Благодарю.
Редактировать: скомпилировано для отладки с GCC4.3.2
Задача ещё не решена.
Других решений пока нет …