boost regex比isupper和isdigit的组合慢吗?
Is boost regex slower than this combination of isupper and isdigit?
我需要检查字符串是否仅由一组特殊字符(ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789<
)组成。
我可以使用boost正则表达式或isupper
和isdigit
的组合。当涉及到性能时,哪一个会被认为是更好的选择?我正在测试的字符串长度约为100个字符。
bool IsValid(string& rString)
{
boost::regex regex("[0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ<]+");
boost::cmatch match;
return boost::regex_match(rString.c_str(), match, regex);
}
bool IsValid(string& rString)
{
for (string::size_type i = 0; i < rString.size(); ++i)
if (!isupper(rString[i]))
if (!isdigit(rString[i]))
if (rString[i] != '<')
return false;
return true;
}
YYY比YYY慢?
答案:time it
在本例中(将boost::regex替换为std::regex):
#include <vector>
#include <iostream>
#include <iomanip>
#include <regex>
bool IsValid1(std::string const& rString)
{
static const std::regex regex("[0-9A-Z<]+");
return std::regex_match(rString, regex);
}
bool IsValid2(std::string const& rString)
{
for (std::string::size_type i = 0; i < rString.size(); ++i)
if (!std::isupper(rString[i]))
if (!std::isdigit(rString[i]))
if (rString[i] != '<')
return false;
return true;
}
auto make_samples = []()
{
std::vector<std::string> result;
result.reserve(100000);
std::generate_n(std::back_inserter(result), 100000, []
{
if (rand() < (RAND_MAX / 2))
{
return std::string("ABCDEF34<63DFGS");
}
else
{
return std::string("ABCDEF34<63DfGS");
}
});
return result;
};
int main() {
auto samples = make_samples();
auto time = [](const char* message, auto&& func)
{
clock_t tStart = clock();
auto result = func();
clock_t tEnd = clock();
std::cout << message << " yields " << result << " in " << std::fixed << std::setprecision(2) << (double(tEnd - tStart) / CLOCKS_PER_SEC) << 'n';
};
time("regex method: ", [&]()->std::size_t
{
return std::count_if(samples.begin(), samples.end(), IsValid1);
});
time("search method: ", [&]()->std::size_t
{
return std::count_if(samples.begin(), samples.end(), IsValid2);
});
}
样本结果:regex method: yields 49816 in 1.29
search method: yields 49816 in 0.04
相关文章:
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 可组合的lambda/std::函数与std::可选
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 混合组合和继承的C++问题
- 我需要将多个函数组合为一个函数
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 通过组合不同的类型来创建唯一的id
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 模板元编程:如何将参数包组合成新的参数包
- 检查向量是否具有所有可能的字符组合
- 如何在加密++中将两个源组合成新的源
- 根中的组合
- 更改 C++ 中的组合分类变量
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 组合字符串不适用于 libCurl,C++
- 测试两个类型列表中的所有组合
- 将多个 for 循环组合成单个迭代器
- 如何从组合指数中找到仓位
- 防止组合框被关闭
- boost regex比isupper和isdigit的组合慢吗?