Si el resultado puede variar durante una sola ejecución, es posible que pueda utilizar la evaluación diferida de los operadores booleanos para dividir su condición en una parte barata y una parte costosa, y ejecutar primero la parte barata.
if (a == 5 && somethingexpensive())
{
...
}
Dado que el cálculo de a == 5
es más barato que somethingexpensive()
, y si es casi siempre false
se debe ejecutar en primer lugar, lo que evita la evaluación de la cláusula somethingexpensive
.
Si, por el contrario, el resultado es constante para una ejecución del programa, puede optimizarlo almacenando el resultado del cálculo en una variable estática o global.
static int result = doevalfunctiononlyonce();
if (result)
{
....
}
De esta manera se ha reducido el costo de la if
a una simple consulta de la memoria.
Si la condición sólo cambia en respuesta a una acción en otro procedimiento, puede actualizar el mundial a este procedimiento:
int condition;
void appendToList(int a)
{
list.append(a);
if (list.somethingexpensive())
{
condition = true;
} else
{
condition = false;
}
}
void someotherfunction()
{
// if (list.somethingexpensive())
if (condition)
{
...
}
}
Esto es útil si someotherfunction
se llama mucha más frecuencia que la función appendtolist
.
relacionado: http://stackoverflow.com/questions/1668013/can-likely-unlikely-macros-be-used-in-user-space-code –