2

假设我们有一个字符串 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

提前致谢

4

3 回答 3

4

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

当然,如果你的分析器告诉你你的程序花费了相当大比例的时间来检查字符串的结尾,情况就不同了;在这种情况下,优化可能会有所帮助。

于 2012-09-12T13:05:15.750 回答
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 作为大海捞针:

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),这两个清单具有相同的性能特征

于 2012-09-12T13:07:24.573 回答
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;
}
于 2012-09-12T13:25:02.577 回答