改变不区分大小写的字符串比较性能

Æle*_*lex 2 c++ string boost c++11

所以,我的博士项目依赖于我已经建立了近3年的软件.它运行,它稳定(它没有崩溃或抛出异常),我正在玩它的发布版本.而且我已经意识到有巨大的性能损失,因为我过分依赖boost :: iequals.我知道,关于这一点有很多关于这个的问题,这不是关于如何做到这一点的问题,而是为什么会发生这种情况.考虑以下:

#include <string.h>
#include <string>
#include <boost/algorithm/string.hpp>

void posix_str ( )
{
    std::string s1 = "Alexander";
    std::string s2 = "Pericles";
    std::cout << "POSIX strcasecmp: " << strcasecmp( s1.c_str(), s2.c_str() ) << std::endl;
}

void boost_str ( )
{
    std::string s1 = "Alexander";
    std::string s2 = "Pericles";
    std::cout << "boost::iequals: " << boost::iequals( s1, s2 ) << std::endl;
}

int main ( )
{
    posix_str();
    boost_str();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我把它放在valgrind和cachegrind中,令我惊讶的是,boost比原生posix或std(看起来使用相同的posix)方法慢4倍.四次,现在已经很多了,即使考虑到C++提供了一个很好的安全网.这是为什么?我真的希望其他人能够运行这个,并向我解释一下这样的性能如何受到影响.是所有的分配(似乎来自呼叫者地图).我并不喜欢提升,我喜欢它并随处随地使用它.编辑:此图显示了我的意思

sba*_*bbi 7

Boost::iequals是区域设置意识.你可以从它的定义见这里需要的是默认为一个可选的第三个参数缺省构造的 std::locale,表示当前全球C++语言环境,如设置std::locale::global.

这或多或少意味着编译器无法预先知道将使用哪个语言环境,这意味着将对某个函数进行间接调用,以将当前语言环境中的每个字符转换为小写.

在另一方面,该文档strcasecmp 规定:

在POSIX语言环境中,strcasecmp()和strncasecmp()的行为就好像字符串已经转换为小写,然后执行字节比较.结果未在其他语言环境中指定.

这意味着语言环境是固定的,因此您可以期望它得到大量优化.