【发布时间】:2014-03-27 12:20:26
【问题描述】:
我的算法不是很强。有两个版本的函数,如果传递的字符串中有任何大写字母,则返回。
First 不检查每次迭代的条件。第一次出现大写字母后的第二次结束。
一般来说哪个更快?
bool isAnyCapLetters(const std::string &s) {
int flag = 0;
for (auto el : s)
flag += isupper(el);
return static_cast<bool>(flag);
}
bool isAnyCapLetters(const std::string &s) {
for (auto el : s)
if (isupper(el)) return true;
return false;
}
【问题讨论】:
-
两者似乎都是 O(n),所以时间可能相等
-
@staticx 最坏情况渐近复杂度并不是衡量性能的唯一有用指标。
-
@delnan:是的,在这种情况下,虽然它正在迭代一个未知长度的未知字符串。我认为你必须考虑最坏的情况。另外,这些函数是不相等的,因为一个是计数函数,一个是计数函数,另一个是有效性检查。
-
if花费少于+=,并且可能会提前打破循环 -
@Tim: "
if花费少于+=" - 除非分支预测失败,在这种情况下它可能会慢得多。测量是唯一确定的方法。
标签: c++ performance algorithm