C++代码性能字符串进行比较

C++ code performance strings compare

本文关键字:比较 字符串 代码 性能 C++      更新时间:2023-10-16

我有一个结构数组(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 可能会减慢代码速度。

感谢您的回答

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

运算符==(...) 根据短路比较返回布尔值

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

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

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

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

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

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

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

因此,如果前导字符不同,则永远不会进行字符串比较。如果数据集使得前导字符可能不同,则可以节省大量时间。(strcmp也有这种优化,但你仍然需要付出设置参数和进出函数的代价。我们在这里谈论的是少量周期。

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

比较数字比比较字符串更快。在比较字符串本身之前,请尝试比较字符串长度。