Un'istruzione if implica un ramo condizionale che potrebbe essere un po 'più costoso di un codice che non si dirama.
Come esempio, contare quante volte una condizione è true (ad esempio quanti numeri in un vettore sono maggiore di 10000):
for (std::vector<int>::const_iterator it = v.begin(), end = v.end(); it != end; ++it) {
//if (*it > 10000) ++count;
count += *it > 10000;
}
La versione che semplicemente aggiunge 1 o 0 per il maggio totale corrente essere una piccola quantità più veloce (ho provato con 100 milioni di numeri prima di poter discernere una differenza).
Tuttavia, con MinGW 3.4.5, utilizzando un algoritmo standard dedicato risulta essere notevolmente più veloce:
count = std::count_if(v.begin(), v.end(), std::bind2nd(std::greater<int>(), 10000));
Quindi la lezione è che prima di iniziare a ottimizzare prematuramente, utilizzando alcuni trucchi che avete imparato dagli Internet, potresti provare le pratiche raccomandate per la lingua. (E naturalmente assicuratevi per prima cosa che quella parte del programma sia irragionevolmente lenta in primo luogo.)
Un altro punto in cui è spesso possibile evitare di valutare condizioni complesse è l'utilizzo di tabelle di ricerca (una regola pratica: gli algoritmi possono spesso essere eseguiti più rapidamente se si consente loro di utilizzare più memoria). Ad esempio, le vocali AEIOU (conteggio) in una parola-list, dove si può evitare di ramificazione e la valutazione delle condizioni multiple:
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];
}
}
Stai dicendo uso un'istruzione if al posto di un'istruzione if? Che cosa stai suggerendo di usare invece? –
se l'istruzione è più estesa di + - * /, ma è molto più economica del ciclo! quindi usali quando ne hai bisogno :) – Tommy
come può 'se' essere costoso il suo test seguito dal salto nel caso in cui solo il blocco è limitato. Ecco perché inserire sempre il codice subito dopo per il quale il test è vero la maggior parte delle volte. Una moltiplicazione è più costosa. Quindi chi ti ha mai detto "se" è una dichiarazione costosa probabilmente non è la velocità di manutenzione. – affan