2012-10-14 6 views
6

Se ho un booleano e del codice che forse lo cambia, e poi voglio impostarlo su true, dovrei controllare se è false?È meglio controllare una variabile prima di impostarne il valore in C++?

Ad esempio:

bool b = false; 
// Some code 
// Here "b" can be true or false 
if (cond) { 
    b = true; 
} 

vs

bool b = false; 
// Some code 
// Here `b` can be `true` or `false` 
if (cond && !b){ 
    b = true; 
} 

che è più veloce?

Nota:

chiedo che a causa della seguente implementazione di Sieve of Eratosthenes:. http://bloc.gerardfarras.com/wp-content/uploads/2011/12/erastotenes.txt

if ((i % divisor == 0) && (numsprimers[i] == 0)) { 
    numsprimers[i] = 1; 
} 

(Se numsprimers[i]==1 significa che i non è un numero primo E se è 0 è può essere primo o no)

+1

Un altro modo di pensarlo come: "Perché controllare? Basta sovrascrivere!" – Mysticial

+0

@Mysticial in realtà ricordo un programma che ha ottenuto un enorme aumento di velocità controllando un valore booleano e quindi sovrascrivendolo anziché sovrascrivendolo. Non ho un punto di riferimento, ma forse ne varrebbe la pena fare uno ... –

+0

@SethCarnegie Era un tipo definito dall'utente? – Mysticial

risposta

2

È molto nitpicky, ma in generale è meglio cambiare il valore.

Il controllo e l'impostazione di un valore hanno in ogni caso lo stesso overhead, quindi perché dovresti voler eseguire entrambi in alcuni casi?

Ora se ti stai chiedendo se dovresti sovrascrivere un tipo personalizzato (diciamo un elenco di 100000 parole) o se dovresti controllare per vedere se ha bisogno di essere sovrascritto per primo (diciamo semplicemente controllando un valore booleano o un timestamp), quindi dovresti controllare prima, perché il costo di controllare un booleano o un timestamp è molto meno che scrivere tante parole in memoria.

Si tratta naturalmente di tutto dipende da varie cose, come se la memoria che si sta modificando o non è nella cache, quanto costoso il "check" è, come spesso è necessario sovrascrivere il valore rispetto a quanto spesso non ha bisogno da sovrascrivere, e ovviamente la dimensione della memoria.

+1

dato il vostro Sieve, dal momento che gli unici valori possibili sono 0 e 1, non vedo alcuna ragione per controllare il valore di numsprimers [i] prima di cambiarlo. Questo risulta in molte istruzioni dopo tutto: Ottieni valore di nuprimers [i]. Confronto a 0. Vai da qualche altra parte nel codice se si tratta di 0. – Ben

+0

molto tempo fa, forse ho ancora una risposta: Nel mio caso tutt'al più elementi avranno ancora il valore desiderato = true. Quindi controllare se il valore è ancora true potrebbe evitare di impostarlo nuovamente su true. significa "solo cambiando il valore senza controllare prima di" essere ancora un funzionamento rapido uguale se si parla di decine di milioni di elementi in somma? – Kaspatoo

+0

Trovo strano che nessuno qui si rivolga al multithreading. Per quanto ne sappia (a prescindere dal blocco) la scrittura rende una linea di cache "sporca" e forza tutti gli altri core a ricaricarla, mentre la lettura non lo fa. Una domanda ovvia che viene in mente è se la scrittura lo stesso valore alla cache contrassegna come sporca e costringe una ricarica di altre cache core, che, in determinate circostanze, sarebbe sicuramente rendere il "basta sovrascrivere" l'opzione più lento del controllo e sovrascrivere (poiché il controllo lascerebbe intatta la cache di altri core). – Cookie

0

ne dite:

if (b = !!cond) { 

} 

Dove si controlla la condizione e applicare il valore di b, se è necessario che b per avere un valore. Se vuoi che b rimanga vero, ti dico di usare uno dei tuoi altri esempi. Non dovrebbe fare la differenza.

+0

Ma forse 'cond' è' false' e ​​'b' è' true'. Voglio che 'b' rimanga' true'. – Oriol

Problemi correlati