Оператор if подразумевает условную ветвь, которая может быть немного дороже, чем код, который не ветвится.
В качестве примера, подсчет, сколько раз условие выполнено (например, сколько чисел в векторе больше 10000):
for (std::vector<int>::const_iterator it = v.begin(), end = v.end(); it != end; ++it) {
//if (*it > 10000) ++count;
count += *it > 10000;
}
Версия, которая просто добавляет 1 или 0 к итоговой сумме, может быть немного быстрее (я попробовал набрать 100 миллионов чисел, прежде чем смог различить разницу).
Однако в MinGW 3.4.5 использование выделенного стандартного алгоритма оказывается заметно быстрее:
count = std::count_if(v.begin(), v.end(), std::bind2nd(std::greater<int>(), 10000));
Итак, урок заключается в том, что перед тем, как начать преждевременную оптимизацию, используя некоторые приемы, которые вы узнали из интернета, вы можете попробовать рекомендуемые методы для этого языка. (И, естественно, сначала убедитесь, что эта часть программы неоправданно медленная.)
Другое место, где вы часто можете избежать оценки сложных условий, - это использование справочных таблиц (эмпирическое правило: алгоритмы часто можно сделать быстрее, если вы позволите им использовать больше памяти). Например, подсчет гласных (aeiou) в списке слов, где вы можете избежать разветвления и оценки нескольких условий:
unsigned char letters[256] = {0};
letters['a'] = letters['e'] = letters['i'] = letters['o'] = letters['u'] = 1;
for (std::vector<std::string>::const_iterator it = words.begin(), end = words.end(); it != end; ++it) {
for (std::string::const_iterator w_it = it->begin(), w_end = it->end(); w_it != w_end; ++w_it) {
unsigned char c = *w_it;
/*if (c == 'e' || c == 'a' || c == 'i' || c == 'o' || c == 'u') {
++count;
}*/
count += letters[c];
}
}