È possibile evitare molti "o" (||) nelle condizioni che causano la stessa azione? - pagina 2

 
TarasBY:

Si possono anche ottimizzare i calcoli in questo modo:

Grazie! Mi è già stato consigliato di usare bool Avals, e Vinin mi ha avvertito che avrebbe seriamente rallentato. E dopo aver quasi finito un EA sto cercando qualcos'altro da ottimizzare nel codice. Sono già riuscito a ridurre la corsa nel tester su tutte le zecche in 12 mesi da 40 minuti a 13!
 

È stato detto molte volte: non ci sono scorciatoie in MCL, se (a||b|||c||d|e){} tutte le condizioni saranno controllate.

La via d'uscita sono le condizioni di nidificazione:

if(a){if(b){if(c){}} in questo caso l'uscita avverrà alla prima condizione corrispondente

Ma anche la nidificazione non è infinita, la soluzione più flessibile è controllare le condizioni in un ciclo con un'uscita:

bool cond[]={a,b,c,d,e,...};
int sz = ArraySize(cond);
for(int i=0;i<sz;i++){
   if(cond[i]){
      bla.bla.bla;
      break;
   }
}
 
Vinin: Si può, ma la velocità cala molto.
Victor, i tuoi avvertimenti (sull'uso di una variabile bool) si applicano alle mie opzioni di ottimizzazione?!
 
FAQ:

È stato detto molte volte: non ci sono scorciatoie in MCL, se (a||b|||c||d|e){} tutte le condizioni saranno controllate.

La via d'uscita sono le condizioni di nidificazione:

if(a){if(b){if(c){}} in questo caso l'uscita avverrà alla prima condizione corrispondente

Ma anche la nidificazione non è infinita, la soluzione più flessibile è controllare le condizioni in un ciclo con un'uscita:

Grazie mille! Farò un tentativo! Conosci lo spagnolo? Perché "bla, bla, bla" viene dal verbo "parlare" (hablar)!
 
No, ma sono bravo a Olban :))
 
FAQ:
No, ma conosco bene Olbanian :))

Annidare le condizioni if(a){if(b){if(c){}} non va bene, perché tutte le condizioni si escludono a vicenda, ma qualcosa non funziona con i booleani. Probabilmente e molto probabilmente sto facendo qualcosa di sbagliato. Finora mi sono fermato a fare una variabile doppia per ogni condizione e a incollarla nello stesso if() con 4 "o". Come mi aspettavo, non ha influito sulla velocità dei test. Gli stessi 13 minuti su tutte le zecche in 12 mesi.

O forse questa lingua si chiamaOblansky?

 
borilunad:

Le condizioni annidate if(a){if(b){if(c){}} non sono buone, perché tutte le condizioni si escludono a vicenda. Probabilmente e molto probabilmente sta facendo qualcosa di sbagliato.


Tutto va bene, basta ricordare alcune identità dell'aritmetica booleana, per esempio: a || b = !( !a && !b ). Allora cambiando dalla congiunzione alla disgiunzione possiamo sostituire il controllo della condizione OR con il controllo consecutivo (annidato) delle condizioni AND: per esempio, se (a || b || c) si trasforma, come ha giustamente scritto TarasBY sopra, in

bool M = true;

if(!a) {if(!b) {if(!c) M=false;}}

if(!M) {Action;}

Questo codice è in generale più veloce del codice originale con |||, perché viene eseguito solo finché una delle condizioni nella lista è vera, cioè finché l'intera operazione OR risulta in TRU.

 
alsu:

Tutto va bene, basta ricordare alcune identità dell'aritmetica booleana, per esempio: a || b = !( !a && !b ). Allora cambiando dalla congiunzione alla disgiunzione possiamo sostituire il controllo della condizione OR con il controllo consecutivo (annidato) delle condizioni AND: per esempio, se (a || b || c) si trasforma, come ha giustamente scritto TarasBY sopra, in

Questo codice è in generale più veloce del codice originale con ||| perché viene eseguito solo finché una delle condizioni nella lista è vera, cioè finché l'intera operazione OR produce un risultato TRU.

Possiamo anche accelerare, per esempio, se sappiamo che la condizione A viene eseguita in media più spesso di C, e C più spesso di B, allora dovremmo metterle in questo ordine: if(!a){if(!c)if{(!b) M=false;}}
 
alsu:

Tutto va bene, basta ricordare alcune identità dell'aritmetica booleana, per esempio: a || b = !( !a && !b ). Allora cambiando dalla congiunzione alla disgiunzione possiamo sostituire il controllo della condizione OR con il controllo consecutivo (annidato) delle condizioni AND: per esempio, se (a || b || c) si trasforma, come ha giustamente scritto TarasBY sopra, in

Questo codice è in generale più veloce del codice originale con ||| perché viene eseguito solo finché una delle condizioni nella lista è vera, cioè finché l'intera operazione OR produce un risultato TRU.

Grazie per la vostra partecipazione! Ho 5 condizioni diverse ma di valore uguale, e se nessuna condizione è vera, l'EA aspetta che una di esse venga eseguita. Quindi nessuna delle forme di attuazione si è rivelata migliore, nonostante i miei sforzi. Perciò, per ora mi atterrò alle mie "torte".
 
borilunad:
Grazie per la vostra partecipazione! Ho 5 condizioni diverse ma uguali, e se nessuna condizione è soddisfatta, l'EA aspetta che una di esse sia soddisfatta. Pertanto, nessuna forma di implementazione si è dimostrata migliore, nonostante i miei sforzi. Perciò, per ora mi atterrò alle mie "torte".
Anche quello che ti ho appena mostrato? Bene, allora le prestazioni dovrebbero essere migliorate da qualcos'altro.