性能。寻找一个子串。 substr vs find

时间:2012-09-12 12:57:10

标签: c++ string performance

假设我们有一个字符串var“sA”,我想检查字符串“123”是否在sA的末尾。

做什么更好,为什么:

  • if(sA.length() > 2) sA.substr(sA.length()-3) == "123"
  • if(sA.length() > 2) sA.find("123", sA.length() -3) != string::npos

提前致谢

3 个答案:

答案 0 :(得分:4)

第二个代码片段避免创建两个临时对象(一个用于"123"转换为std::string,另一个用于substr的返回值),所以理论上应该是快点。但是,这种微优化很少能够获得回报:如果你随机应用这种优化,你不太可能看到使用第二种形式而非第一种形式获得实质性收益。

当然,如果您的探查器告诉您程序花费大量时间来检查字符串的结尾,情况会有所不同;在这种情况下,优化可能会有所帮助。

答案 1 :(得分:2)

如果性能至关重要,我认为你不能比这更快(与其他方法相比,不需要分配):

const char needle[] = "abc";
const char *haystack;
const int len = strlen(haystack);

if (len<sizeof(needle))
    return false;
for (int i=0; i<sizeof(needle); i++)
    if (needle[i] != haystack[len-sizeof(needle)+i])
        return false;
return true;

显然,各种微观优化都是可能的,但这种方法是我能想到的最快的方法。


更多C ++ y版本,使用std :: string作为haystack:

const char needle[] = "abc";
const std::string haystack;
const int len = haystack.length();

if (len<sizeof(needle))
    return false;
for (int i=0; i<sizeof(needle); i++)
    if (needle[i] != haystack[len-sizeof(needle)+i])
        return false;
return true;

请注意,只要std::string::operator[]为O(1),这两个列表就具有相同的性能特征

答案 2 :(得分:1)

此代码可能比您正在测试的代码更快。 但是你只会知道你是否做了一些测试。

bool EndsWith(const string &strValue, const string &strEnd)
{            
    int iDiference = strValue.size() - strEnd.size();
    if(iDiference >= 0)     
        return (memcmp(strValue.c_str() + iDiference, strEnd.c_str(), strEnd.size()) == 0);

    return false;
}