Est-il possible d'éviter de nombreux "ou" (||) dans les conditions entraînant la même action ? - page 2

 
TarasBY:

Vous pouvez également optimiser les calculs de cette manière :

Merci ! On m'a déjà conseillé d'utiliser bool Avals, et Vinin m'a prévenu que cela ralentirait sérieusement. Et après avoir presque terminé un EA, je cherche quelque chose d'autre à optimiser dans le code. J'ai déjà réussi à réduire le temps de fonctionnement du testeur sur tous les ticks en 12 mois de 40 minutes à 13 !
 

Cela a été dit à maintes reprises : il n'y a pas de raccourci dans MCL, si(a||b||c||d||e){} toutes les conditions seront vérifiées.

L'issue est dans les conditions de nidification :

if(a){if(b){if(c){}}}, auquel cas la sortie se produira à la première condition correspondante.

Mais l'imbrication n'est pas non plus infinie, la solution la plus souple est de vérifier les conditions dans une boucle avec une sortie :

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: Vous pouvez, mais la vitesse diminue beaucoup.
Victor, vos avertissements (sur l'utilisation d'une variable bool) s'appliquent-ils à mes options d'optimisation !
 
FAQ:

Cela a été dit à maintes reprises : il n'y a pas de raccourci dans MCL, si(a||b||c||d||e){} toutes les conditions seront vérifiées.

L'issue est dans les conditions de nidification :

if(a){if(b){if(c){}}}, auquel cas la sortie se produira à la première condition correspondante.

Mais l'imbrication n'est pas non plus infinie, la solution la plus souple est de vérifier les conditions dans une boucle avec une sortie :

Merci beaucoup ! Je vais essayer ! Vous connaissez l'espagnol ? Parce que "bla, bla, bla" vient du verbe "parler" (hablar) !
 
Non, mais je suis bon en Olban :))
 
FAQ:
Non, mais je connais bien Olbanian :))

L'imbrication des conditions if(a){if(b){if(c){}} n'est pas bonne, car toutes les conditions sont mutuellement exclusives, mais quelque chose ne fonctionne pas avec les booléens. Il est probable et très probable que je fasse quelque chose de mal. Jusqu'à présent, je me suis arrêté à faire une variable double pour chaque condition et à la coller dans le même if() avec 4 "ou". Comme je m'y attendais, cela n'a pas affecté la vitesse des tests. Les mêmes 13 minutes sur tous les ticks en 12 mois.

Ou peut-être que cette langue s'appelleOblansky?

 
borilunad:

Les conditions imbriquées if(a){if(b){if(c){}} ne sont pas bonnes, car toutes les conditions s'excluent mutuellement. Vous faites probablement et très probablement quelque chose de mal.


Tout va bien, il suffit de se rappeler quelques identités de l'arithmétique booléenne, par exemple : a || b = !( !a && !b ). Ensuite, en passant de la conjonction à la disjonction, nous pouvons remplacer la vérification de la condition OR par une vérification consécutive (imbriquée) des conditions AND : par exemple, si (a || b || c) se transforme, comme TarasBY l'a justement écrit ci-dessus, en

bool M = true;

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

if(!M) {Action;}

Ce code est en général plus rapide que le code original avec ||, parce qu'il n'est exécuté que jusqu'à ce que l'une des conditions de la liste soit vraie, c'est-à-dire jusqu'à ce que l'opération OU entière résulte en TRU.

 
alsu:

Tout va bien, il suffit de se rappeler quelques identités de l'arithmétique booléenne, par exemple : a || b = !( !a && !b ). Ensuite, en passant de la conjonction à la disjonction, nous pouvons remplacer la vérification de la condition OR par une vérification consécutive (imbriquée) des conditions AND : par exemple, si (a || b || c) se transforme, comme TarasBY l'a justement écrit ci-dessus, en

Ce code est en général plus rapide que le code original avec || car il n'est exécuté que jusqu'à ce que l'une des conditions de la liste soit vraie, c'est-à-dire jusqu'à ce que l'opération OU entière donne un résultat TRU.

Nous pouvons également accélérer, par exemple, si nous savons que la condition A est exécutée en moyenne plus souvent que C, et C plus souvent que B, alors nous devrions les mettre dans cet ordre : if( ! a){if( ! c)if{( ! b) M=false;}}.
 
alsu:

Tout va bien, il suffit de se rappeler quelques identités de l'arithmétique booléenne, par exemple : a || b = !( !a && !b ). Ensuite, en passant de la conjonction à la disjonction, nous pouvons remplacer la vérification de la condition OR par une vérification consécutive (imbriquée) des conditions AND : par exemple, si (a || b || c) se transforme, comme TarasBY l'a justement écrit ci-dessus, en

Ce code est en général plus rapide que le code original avec || car il n'est exécuté que jusqu'à ce que l'une des conditions de la liste soit vraie, c'est-à-dire jusqu'à ce que l'opération OU entière donne un résultat TRU.

Merci de votre participation ! J'ai 5 conditions différentes mais de valeur égale, et si aucune condition n'est vraie, l'EA attend l'exécution de l'une d'entre elles. Par conséquent, aucune des formes de mise en œuvre ne s'est avérée meilleure, malgré mes efforts. Par conséquent, je vais m'en tenir à mes "tartes" pour l'instant.
 
borilunad:
Merci de votre participation ! J'ai 5 conditions différentes mais égales, et si aucune condition n'est remplie, l'EA attend que l'une d'entre elles le soit. Par conséquent, aucune forme unique de mise en œuvre ne s'est avérée meilleure, malgré mes efforts. Par conséquent, je vais m'en tenir à mes "tartes" pour l'instant.
Même ce que je viens de vous montrer ? Alors, les performances doivent être améliorées par autre chose.