Una instrucción if implica una bifurcación condicional que puede ser un poco más cara que un código que no se bifurca.
Como ejemplo, contando el número de veces una condición es verdadera (por ejemplo, la cantidad de números en un vector son mayores que 10000):
for (std::vector<int>::const_iterator it = v.begin(), end = v.end(); it != end; ++it) {
//if (*it > 10000) ++count;
count += *it > 10000;
}
La versión que simplemente añade 1 o 0 a la de mayo total acumulado ser un poco más rápido (lo intenté con 100 millones de números antes de poder discernir la diferencia).
Sin embargo, con MinGW 3.4.5, utilizando un algoritmo estándar dedicada resulta ser notablemente más rápido:
count = std::count_if(v.begin(), v.end(), std::bind2nd(std::greater<int>(), 10000));
Así que la lección es que antes de comenzar a optimizar prematuramente, el uso de algunos trucos que he aprendió de los internets, puede probar las prácticas recomendadas para el idioma. (Y, naturalmente, primero asegúrese de que esa parte del programa sea irrazonablemente lenta en primer lugar.)
Otro lugar donde a menudo puede evitar la evaluación de condiciones complicadas es usando tablas de búsqueda (una regla de oro: los algoritmos a menudo pueden hacerse más rápidos si les permite usar más memoria). Por ejemplo, las vocales de conteo (aeiou) en una lista de palabras, donde se puede evitar la ramificación y la evaluación de múltiples condiciones:
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];
}
}
¿Estás diciendo usar una instrucción if en lugar de una declaración if? ¿Qué estás sugiriendo usar en su lugar? –
if statement es más expansivo que + - * /, ¡pero es mucho más económico que loop! así que úsalas cuando las necesites :) – Tommy
¿Cómo puede 'si' ser costoso su prueba seguida de un salto en caso de que solo bloquee más? Es por eso que siempre pone el código justo después si la prueba es verdadera la mayor parte del tiempo. Una multiplicación es más costosa. Entonces, ¿quién te dijo que 'si' es una afirmación cara, que probablemente sea más fácil de mantener que de velocidad? – affan