我的旧修剪功能:
string TailTrimString (const string & sSource, const char *chars) {
size_t End = sSource.find_last_not_of(chars);
if (End == string::npos) {
// only "*chars"
return "";
}
if (End == sSource.size() - 1) {
// noting to trim
return sSource;
}
return sSource.substr(0, End + 1);
}
取而代之的是我决定使用boost,写下了琐碎的事情:
string TailTrimString (const string & sSource, const char *chars) {
return boost::algorithm::trim_right_copy_if(sSource,boost::algorithm::is_any_of(chars));
}
我惊讶地发现新功能运行得慢得多。
我做了一些分析,我发现函数is_any_of
非常慢。
boost的实现是否可能比我非常简单的实现慢?为了提高性能,我应该使用is_any_of
代替{{1}}吗?
我还在boost的邮件列表中找到了discussion这个问题,但我仍然不确定如何提高代码的性能。
我使用的升级版本是1.38,这是相当古老的,但我想这段代码从那以后没有太大的变化。
谢谢。
答案 0 :(得分:4)
boost的实现可能比我非常简单的实现慢吗?
当然。
为了提高性能,我应该使用什么代替is_any_of吗?
是的 - 您的原始代码。你没有说它有缺陷,或者你使用boost重新实现它的原因。如果原始代码中没有缺陷,那么没有合理的理由放弃原始实现。
将Boost引入代码库是有道理的。它带来了许多有用的功能。但是,为了使用新技术的唯一目的而掏空功能是一个很大的新手错误。
回应你的评论:
我仍然不明白,为什么提升的表现更差。
旨在为一个特定应用程序执行一项特定工作的手工制作功能通常比通用解决方案更快。 Boost是一个很棒的通用工具库,可以节省大量的编程和许多缺陷。但它的通用。您可能只需要以特定方式修剪字符串,但Boost会处理所有内容。这需要时间。
答案 1 :(得分:1)
在回答关于相对性能的问题时,std::string::find_last_not_of
将包装C字符串例程(例如strcspan
),这些例程非常快,但boost::algorithm::is_any_of
使用(可能曾经使用过,我担心在以后的版本中这已经发生了变化!)std::set
用于查找要查找的字符集,并为每个字符检查此集合 - 这些不会在任何地方附近快!
编辑:只是为了添加回声,你的功能有效,它没有被破坏,它不慢,所以不要费心去改变它......
答案 2 :(得分:1)
回答你关于相对表现的问题。
您正在使用boost::algorithm::trim_right_copy_if
,根据名称,在修剪前创建输入的副本。尝试使用boost::algorithm::trim_right_if
查看是否有更好的效果。此函数将就地执行操作,而不是新字符串。