【问题标题】:Performance of a trimming function微调功能的执行
【发布时间】:2010-11-30 14:23:00
【问题描述】:

我的旧修剪功能:

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

我还在 boost 的邮件列表中找到了一个 discussion 关于这个问题,但我仍然不确定如何提高我的代码的性能。

我使用的 boost 版本是 1.38,相当老了,但我想这段代码从那时起并没有太大变化。

谢谢。

【问题讨论】:

  • 你为什么不使用你的旧实现?它速度很快,并且产生了预期的结果。
  • 为什么要重新实现一个工作函数?
  • 我重新实现它只是因为我希望 boost 能够提供更好的性能。我还是不明白,为什么boost的性能更差。
  • @Igor Oks:因为它使用了更多的抽象。这里运行的 boost 代码(在幕后)可能有几百行,而不是几个字符串操作。
  • @Igor:您是否分析了您的代码并确定 TailTrimString 是一个需要修复的问题?

标签: c++ performance boost stl trim


【解决方案1】:

boost 的实现可能比我非常简单的实现慢吗?

当然。

为了提高性能,我应该使用什么来代替 is_any_of 吗?

是的 - 您的原始代码。你没有说它有缺陷,或者你使用 boost 重新实现它的原因。如果原始代码没有缺陷,则没有正当理由放弃原始实现。

将 Boost 引入代码库是有意义的。它带来了很多有用的功能。但是仅仅为了使用新技术而删除一个函数是一个很大的新手错误。

编辑:

回应您的评论:

我还是不明白,为什么boost的性能更差。

旨在为特定应用程序完成一项特定工作的手工制作的功能通常比通用解决方案更快。 Boost 是一个很棒的通用工具库,可以节省大量的编程和缺陷。但它的通用性。您可能只需要以特定方式修剪您的字符串,但 Boost 可以处理所有事情。这需要时间。

【讨论】:

    【解决方案2】:

    在回答您关于相对性能的问题时,std::string::find_last_not_of 将包装 C 字符串例程(例如 strcspan),这些非常快,但是 boost::algorithm::is_any_of 使用(可能曾经使用过,我' d 冒险在以后的版本中这已经改变了!)std::set 用于查找字符集并为每个字符检查该字符集 - 这不会很快!

    编辑:只是为了添加一个回声,你的功能可以工作,它没有坏,它不慢,所以不要费心去改变它......

    【讨论】:

      【解决方案3】:

      回答您关于相对性能的问题。

      您正在使用boost::algorithm::trim_right_copy_if,根据名称,它会在修剪之前创建输入的副本。尝试使用boost::algorithm::trim_right_if 看看是否有更好的性能。此函数将在原地执行操作,而不是在新字符串上执行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-17
        • 1970-01-01
        • 2018-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多