Оператор 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];
}
}
Вы говорите, что вместо оператора if используется инструкция if? Что вы предлагаете использовать вместо этого? –
Если оператор более экспансивный, чем + - * /, но он намного дешевле, чем цикл! поэтому используйте, когда вам это нужно :) – Tommy
как можно «если» быть дорогим, его тест, за которым следует прыжок в случае еще только блока. Вот почему всегда ставьте код сразу после этого, если для большинства тестов этот тест является истинным. Умножение дороже. Поэтому, кто когда-либо говорил вам, «если» является дорогостоящим заявлением, вероятно, с технической поддержкой w.r.t, а не скоростью. – affan