因此,我的phd项目依赖于我已经开发了近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;
}
我通过valgrind和cachegrind进行了测试,令我惊讶的是,boost比本地posix或std(似乎使用相同的posix)方法慢4倍。即使考虑到C ++提供了很好的安全网,现在也有四倍了。这是为什么?我真的很希望其他人来做这个,并向我解释是什么让这种性能受到打击。是否所有分配(似乎来自于调用方映射)。我不喜欢增强功能,我喜欢它,可以在任何地方和任何地方使用它。编辑:此图显示了我的意思
Boost::iequals
具有区域设置意识。你可以从它的定义见这里需要的是默认为一个可选的第三个参数缺省构造的 std::locale
,表示当前全球C ++语言环境,如设置std::locale::global
。
这或多或少意味着编译器无法事先知道将使用哪个语言环境,这意味着将间接调用某个函数以将每个字符转换为当前语言环境中的小写字母。
在另一方面,该文档的strcasecmp
规定:
在POSIX语言环境中,strcasecmp()和strncasecmp()的行为应类似于将字符串转换为小写字母,然后执行字节比较。在其他语言环境中未指定结果。
这意味着该语言环境是固定的,因此可以期望它会得到优化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句