【问题标题】:C++ code performance strings compareC++ 代码性能字符串比较
【发布时间】:2016-04-27 19:16:05
【问题描述】:

我有一个结构数组 (arrBoards),它有一些整数值、向量和字符串类型。 我想比较结构中的某个字符串是否与输入的参数(字符串 p1)相等。

什么想法更快 - 用数组中的每个字符串元素检查输入字符串的方程,或者首先检查数组的当前字符串元素中的 string.length() 是否大于 0,然后比较字符串。

if (p1.length())
{
    transform(p1.begin(), p1.end(), p1.begin(), ::tolower); //to lowercase
    for (int i=0; i<arrSize; i++) //check if string element already exists
        if ( rdPtr->arrBoards[i].sName == p1 )
        {
            */ some code */
            break;
        }
}

if (p1.length())
{
    transform(p1.begin(), p1.end(), p1.begin(), ::tolower); //to lowercase
    for (int i=0; i<arrSize; i++) //check if string element already exists
        if ( rdPtr->arrBoards[i].sName.length() ) //check length of the string in the element of the array
            if ( rdPtr->arrBoards[i].sName == p1 )
            {
                */ some code */
                break;
            }
}

我认为第二个想法更好,因为它不需要每次都计算名称,但我可能会错,因为使用 if 会减慢代码速度。

感谢您的回答

【问题讨论】:

  • 我很确定sName == p1 将首先进行长度检查(实际上是!empty()),因此您可能会将长度检查的次数加倍。我会对其进行分析,但我的猜测是不要'不要打扰长度检查
  • 如果性能是一个问题,你最好看看不同的方法,比如哈希表,根据字符串对数组进行排序,...
  • Galik 的评论基本上就是它的归结。 您的 编译器/STL 实现是否这样做可能取决于您的特定平台/编译器等(尽管我希望任何现代实现都采用!empty() 快​​捷方式)。所以你最好自己做一些基准测试。
  • Galik 和 mindriot 的 cmets 都是有效的 - 但无论这样的基准测试结果如何,让它成为您设计决策的驱动因素可能仍然不是一个好主意:您的环境可能更改(不同的机器/操作系统/编译器/编译器版本/库版本),使所有以前的基准测试无用。而且,更高级别的设计替代方案可能会对整体性能产生更大的影响。

标签: c++ string performance


【解决方案1】:

我确定字符串类的比较运算符 (==) 已经足够优化。就用它吧。

operator==(...) 根据短路比较返回布尔值

return __x.size() == __n && _Traits::compare(__x.data(), __s, __n) == 0;

它在调用 compare() 之前检查字符串的大小,因此不需要进一步优化。

永远记住软件工程的一项原则:KISS :P

【讨论】:

  • 这里恐怕你错了。 std::string 中的相等运算符(至少在 MS VS2013 中)实现为 return (_Left.compare(_Right) == 0);。这意味着它首先通过在公共长度部分上执行memcmp() 来计算哪个字符串按字典顺序“更大”。例如,将 1,000,000 个 A 的字符串与 1,000,001 个 A 的字符串进行比较将需要一些时间。
  • @VladFeinstein,你能告诉我你从哪里得到的
  • 函数 string::compare() 和 string::==() 是不同的。 string::==() 在幕后调用 compare()。正如您所说, compare() 处于内存级别。
  • 这就是我上面所说的:is implemented as...。我的论点是反对你的说法comparison operator (==) of the string class is already optimized enough;显然不是。如果您只对相等/不相等感兴趣,而不关心哪个字符串更大 - 我可以做得更好。
  • sgi.com/tech/stl/string 查看 operator== 的实现,你会看到它使用了短路比较 => __x.size() == __n && _Traits::compare(__x.data() , __s, __n) == 0;
【解决方案2】:

您想要做的是播放百分比。 由于字符串很可能不同,因此您希望尽快找出答案。

您首先比较长度,但不要假设与您正在做的其他任何事情相比,计算长度很便宜。

这是我做过的事情(在 C 中):

if (a[0]==b[0] && strcmp(a, b)==0)

所以如果前导字符不同,它永远不会进入字符串比较。 如果数据集的前导字符 可能不同,则可以节省大量时间。 (strcmp 也有这种优化,但你还是要付出设置参数和进出函数的代价。我们这里说的是小循环数。)

如果您这样做,那么您可能会发现循环迭代开销会花费大量时间。 如果是这样,您可以考虑展开它。 (编译器可能会为你展开它,但我不会依赖它。)

【讨论】:

  • 除此之外,它是 C 并且使用 c str 和 strcmp,谢谢。我知道了。第一个是比较主要字符,当它通过时,它会跳转到下一个比较整个字符串的例程。
【解决方案3】:

比较一个数字比比较一个字符串要快。在比较字符串本身之前尝试比较字符串长度。

【讨论】:

  • @EdHeal string::length 需要固定时间。
猜你喜欢
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
相关资源
最近更新 更多