gpt4 book ai didi

c++ - 静态正则表达式对象还是重要的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:35 26 4
gpt4 key购买 nike

假设我有以下功能:

bool IsNumber(std::string const& str)
{
return std::regex_match(str, std::regex{"\\d+"});
}

我正在构造 std::regex 每次调用。这样做是否有记录的性能开销?将其设为 static 会更好吗,如下所示?

bool IsNumber(std::string const& str)
{
static std::regex const number_regex{"\\d+"};
return std::regex_match(str, number_regex);
}

还是真的不重要?

最佳答案

编译器可能无法识别每次调用 std::regex 的构造是否相等(例如,构造函数可以访问静态/全局变量)。因此,安全的方法是在任何情况下都构建它。另一方面,现在的编译器非常聪明,也许他对构造函数的解析足够深入,意识到它必须随时间保持不变,从而优化它。无论如何:分析它。例如制作一个循环并测量几千次调用的时间(std::chrono)(至少以秒为单位)。 –

我做了一个非常简单的测试程序来分析它:

#include <stdio.h>
#include <regex>
#include <chrono>

bool IsNumberA( std::string const& str )
{
return std::regex_match( str, std::regex { "\\d+" } );
}

static std::regex number_regex( "\\d+" );
bool IsNumberB( std::string const& str )
{
return std::regex_match( str, number_regex );
}

void main()
{
size_t count = 100000;

std::vector<std::string> aRandomStrings;

for( size_t i = 0; i < count; i++ )
aRandomStrings.push_back((rand() % 2 == 0) ? "nonumberatall" : "3141592");

auto time = std::chrono::system_clock::now();

size_t numberCountA = 0;
for( size_t i = 0; i < count; i++ )
if( IsNumberA( aRandomStrings[i] ) )
numberCountA++;

auto takenTimeA = std::chrono::duration_cast<std::chrono::milliseconds>
(std::chrono::system_clock::now() - time);
time = std::chrono::system_clock::now(); // reset

size_t numberCountB = 0;
for( size_t i = 0; i < count; i++ )
if( IsNumberB( aRandomStrings[i] ) )
numberCountB++;

auto takenTimeB = std::chrono::duration_cast<std::chrono::milliseconds>
(std::chrono::system_clock::now() - time);

printf( "took %d ms for A, %d ms for B\n", takenTimeA.count(), takenTimeB.count() );
}

结果

我也在没有优化的情况下编译了它,只是为了看看编译器 (msvc) 是否足够智能。

A 6283 毫秒,B 41 毫秒

优化:A 268ms,B 85ms

当使用预定义变量 (B) 时,我们可以清楚地看到性能的巨大提升。我不太清楚案例 B 中较慢的发布时间,但时间尺度可能太短了。随机生成器中也可能有很多未知的东西。

关于c++ - 静态正则表达式对象还是重要的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32271967/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com