¿Es posible evitar muchas "ores" (||) en las condiciones que provocan la misma acción? - página 2

 
TarasBY:

También puede optimizar los cálculos de esta manera:

Gracias. Ya me aconsejaron que usara bool Avals, y Vinin me advirtió que se ralentizaría mucho. Y después de haber casi terminado un EA estoy buscando algo más para optimizar en código. ¡Ya he conseguido reducir el tiempo de funcionamiento en el probador de todas las garrapatas en 12 meses de 40 minutos a 13!
 

Se ha dicho muchas veces: no hay atajo en ACM, si(a||b||c|d|e){} se comprobarán todas las condiciones.

La salida son las condiciones de anidación:

if(a){if(b){if(c){}} en cuyo caso la salida se producirá en la primera condición coincidente

Pero el anidamiento tampoco es infinito, la solución más flexible es comprobar las condiciones en un bucle con salida :

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: Se puede, pero la velocidad baja mucho.
Víctor, ¿se aplican tus advertencias (sobre el uso de una variable bool) a mis opciones de optimización?
 
FAQ:

Se ha dicho muchas veces: no hay atajo en ACM, si(a||b||c|d|e){} se comprobarán todas las condiciones.

La salida son las condiciones de anidación:

if(a){if(b){if(c){}} en cuyo caso la salida se producirá en la primera condición coincidente

Pero el anidamiento tampoco es infinito, la solución más flexible es comprobar las condiciones en un bucle con salida :

¡Muchas gracias! Lo intentaré. ¿Sabes algo de español? Porque "bla, bla, bla" viene del verbo "hablar".
 
No, pero soy bueno en Olban :))
 
FAQ:
No, pero conozco bien a Olbanian :))

Anidar condiciones if(a){if(b){if(c){}} no es bueno, porque todas las condiciones son mutuamente excluyentes, pero algo no funciona con booleanos. Probablemente y muy probablemente estoy haciendo algo mal. Hasta ahora me he detenido en hacer una variable doble para cada condición y pegarla en el mismo if() con 4 "or". Como esperaba, no ha afectado a la velocidad de las pruebas. Los mismos 13 minutos en todas las garrapatas durante 12 meses.

¿O tal vez esta lengua se llamaOblansky?

 
borilunad:

Las condiciones anidadas if(a){if(b){if(c){}} no son buenas, porque todas las condiciones son mutuamente excluyentes. Probablemente y con toda probabilidad, haciendo algo mal.


Todo está bien, sólo hay que recordar algunas identidades de la aritmética booleana, por ejemplo: a || b = !( !a && !b ). Entonces, al cambiar de conjunción a disyunción podemos sustituir la comprobación de la condición OR por la comprobación consecutiva (anidada) de las condiciones AND: por ejemplo, si (a || b || c) se convierte, como TarasBY ha escrito acertadamente más arriba, en

bool M = true;

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

if(!M) {Action;}

Este código es en general más rápido que el código original con ||, porque se ejecuta sólo hasta que una de las condiciones de la lista es verdadera, es decir, hasta que toda la operación OR resulta en TRU.

 
alsu:

Todo está bien, sólo hay que recordar algunas identidades de la aritmética booleana, por ejemplo: a || b = !( !a && !b ). Entonces, al cambiar de conjunción a disyunción podemos sustituir la comprobación de la condición OR por la comprobación consecutiva (anidada) de las condiciones AND: por ejemplo, si (a || b || c) se convierte, como TarasBY ha escrito acertadamente más arriba, en

Este código es en general más rápido que el código original con || porque se ejecuta sólo hasta que una de las condiciones de la lista es verdadera, es decir, hasta que toda la operación OR da un resultado TRU.

También podemos acelerar, por ejemplo, si sabemos que la condición A se ejecuta de media más veces que la C, y la C más veces que la B, entonces deberíamos ponerlas en ese orden: if(!a){if(!c)if{(!b) M=false;}}
 
alsu:

Todo está bien, sólo hay que recordar algunas identidades de la aritmética booleana, por ejemplo: a || b = !( !a && !b ). Entonces, al cambiar de conjunción a disyunción podemos sustituir la comprobación de la condición OR por la comprobación consecutiva (anidada) de las condiciones AND: por ejemplo, si (a || b || c) se convierte, como TarasBY ha escrito acertadamente más arriba, en

Este código es en general más rápido que el código original con || porque se ejecuta sólo hasta que una de las condiciones de la lista es verdadera, es decir, hasta que toda la operación OR da un resultado TRU.

Gracias por su participación. Tengo 5 condiciones diferentes pero iguales en valor, y si ninguna condición es verdadera, el EA espera hasta que una de ellas sea verdadera. Por lo tanto, ninguna de las formas de aplicación resultó ser mejor, a pesar de mis esfuerzos. Por lo tanto, seguiré con mis "tartas" por ahora.
 
borilunad:
Gracias por su participación. Tengo 5 condiciones diferentes pero iguales, y si no se cumple ninguna condición, el EA espera a que se cumpla una de ellas. Por lo tanto, ninguna forma de aplicación ha demostrado ser mejor, a pesar de mis esfuerzos. Por lo tanto, seguiré con mis "tartas" por ahora.
¿Incluso lo que te acabo de mostrar? Entonces, el rendimiento debería mejorarse con algo más.