我认为增强正则表达式引擎比boost :: algorithm更快
这个简单的测试显示算法大幅击败正则表达式引擎
这是整个测试程序
我错过了什么吗?
#include "boost/algorithm/string.hpp"
#include "boost/regex.hpp"
#include "boost/xpressive/xpressive.hpp"
#include "boost/progress.hpp"
#include <iostream>
int main()
{
boost::timer tm;
const int ITERATIONS = 10000000;
{
std::string input("This is his face");
tm.restart();
for( int i = 0; i < ITERATIONS; ++i)
{
boost::algorithm::replace_all(input,"his","her");
}
std::cout << "boost::algorithm: " << tm.elapsed()/60 << std::endl;
}
{
std::string input("This is his face");
boost::regex expr("his");
std::string format("her");
tm.restart();
for( int i = 0; i < ITERATIONS; ++i)
{
boost::regex_replace( input, expr, format );
}
std::cout << "boost::regex: " << tm.elapsed()/60 << std::endl;
}
{
std::string input("This is his face");
boost::xpressive::sregex expr = boost::xpressive::as_xpr("his");
std::string format("her");
tm.restart();
for( int i = 0; i < ITERATIONS; ++i)
{
boost::xpressive::regex_replace(input, expr, format);
}
std::cout << "boost::xpressive: " << tm.elapsed()/60 << std::endl;
}
return 0;
}
答案 0 :(得分:3)
正则表达式可以处理所有类型的正则表达式(例如“My。* Test”之类的东西可以在“我想知道有多少个名为MySumTest的类已写入?”的文本中匹配。它们比在文本中查找模式的算法更强大但性能更低
答案 1 :(得分:3)
我觉得这并不令人惊讶;简单的事情通常更快。在更高级别的语言中,比如JavaScript,将字符串处理委托给正则表达式通常是一个胜利,因为即使在解释语言中进行简单循环也会产生很多开销,但同样的推理并不适用于像C ++这样的编译语言。
无论如何,我会说你应该在regex上使用boost字符串算法,这是合理的,因为boost :: regex引入了运行时依赖(它使用外部.so文件),而算法基本上是内联代码生成器,你应该只在你需要的地方使用正则表达式...比如找一个浮点数:
[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?
你想在没有正则表达式的情况下尝试吗?