É possível evitar muitos "ors" (|||) em condições que causem a mesma ação? - página 2

 
TarasBY:

Você também pode otimizar os cálculos desta forma:

Obrigado! Já fui aconselhado a usar bool Avals, e Vinin me avisou que isso iria desacelerar seriamente. E depois de quase terminar uma EA, estou procurando algo mais para otimizar em código. Eu já consegui reduzir o tempo de execução do testador em todos os carrapatos em 12 meses de 40 minutos para 13!
 

Já foi dito muitas vezes: não há atalho no MCL, se(a|||b||||c||d||e){} todas as condições serão verificadas.

A saída são as condições de nidificação:

if(a){if(b){if(c){}}}} Nesse caso, a saída ocorrerá na primeira condição correspondente

Mas o aninhamento também não é infinito, a solução mais flexível é verificar as condições em um loop com uma saída :

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: Você pode, mas a velocidade cai muito.
Victor, seus avisos (sobre o uso de uma variável bool) se aplicam às minhas opções de otimização?!
 
FAQ:

Já foi dito muitas vezes: não há atalho no MCL, se(a|||b||||c||d||e){} todas as condições serão verificadas.

A saída são as condições de nidificação:

if(a){if(b){if(c){}}}} Nesse caso, a saída ocorrerá na primeira condição correspondente

Mas o aninhamento também não é infinito, a solução mais flexível é verificar as condições em um loop com uma saída :

Muito obrigado! Vou tentar! Você conhece algum espanhol? Porque "bla, bla, bla" vem do verbo "falar" (hablar)!
 
Não, mas eu sou bom em Olban :))
 
FAQ:
Não, mas eu conheço bem Olbanês :))

Condições de aninhamento se(a){se(b){se(c){}}} não for bom, porque todas as condições são mutuamente exclusivas, mas algo não funciona com booleano. Provavelmente e muito provavelmente estou fazendo algo errado. Até agora, parei de fazer uma variável dupla para cada condição e colá-la na mesma se() com 4 "ou". Como eu esperava, isso não afetou a velocidade dos testes. Os mesmos 13 minutos em todos os carrapatos durante 12 meses.

Ou talvez este idioma seja chamado deOblansky?

 
borilunad:

Condições aninhadas se(a){se(b){se(c){}} não forem boas, porque todas as condições são mutuamente exclusivas. Provavelmente e muito provavelmente fazendo algo errado.


Tudo é bom, basta lembrar algumas identidades da aritmética booleana, por exemplo: a ||| b = !( !a && !b ). Então, mudando de conjunção para disjunção, podemos substituir a verificação da condição OR pela verificação consecutiva (aninhada) da condição AND: por exemplo, se (a ||| b ||| c) se transformar, como TarasBY escreveu corretamente acima, em

bool M = true;

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

if(!M) {Action;}

Este código é, em geral, mais rápido que o código original com ||, porque é executado apenas até que uma das condições da lista seja verdadeira, ou seja, até que toda a operação OR resulte em TRU.

 
alsu:

Tudo é bom, basta lembrar algumas identidades da aritmética booleana, por exemplo: a ||| b = !( !a && !b ). Então, mudando de conjunção para disjunção, podemos substituir a verificação da condição OR pela verificação consecutiva (aninhada) da condição AND: por exemplo, se (a ||| b ||| c) se transformar, como TarasBY escreveu corretamente acima, em

Este código é em geral mais rápido do que o código original com ||| porque é executado apenas até que uma das condições da lista seja verdadeira, ou seja, até que toda a operação OR produza um resultado TRU.

Também podemos acelerar, por exemplo, se sabemos que a condição A é executada em média mais vezes do que C, e C mais vezes do que B, então devemos colocá-las nessa ordem: if(!a){if(!c)if{(!b) M=false;}}}
 
alsu:

Tudo é bom, basta lembrar algumas identidades da aritmética booleana, por exemplo: a ||| b = !( !a && !b ). Então, mudando de conjunção para disjunção, podemos substituir a verificação da condição OR pela verificação consecutiva (aninhada) da condição AND: por exemplo, se (a ||| b ||| c) se transformar, como TarasBY escreveu corretamente acima, em

Este código é em geral mais rápido do que o código original com ||| porque é executado apenas até que uma das condições da lista seja verdadeira, ou seja, até que toda a operação OR produza um resultado TRU.

Obrigado por sua participação! Tenho 5 condições diferentes, mas iguais em valor, e se nenhuma condição for verdadeira, a EA espera até que uma delas seja verdadeira. Portanto, nenhuma das formas de implementação provou ser melhor, apesar dos meus esforços. Portanto, por enquanto, vou ficar com minhas "tortas".
 
borilunad:
Obrigado por sua participação! Tenho 5 condições diferentes, mas iguais, e se nenhuma condição for cumprida, a EA espera que uma delas seja cumprida. Portanto, nenhuma forma única de implementação provou ser melhor, apesar dos meus esforços. Portanto, por enquanto, vou ficar com minhas "tortas".
Mesmo o que acabei de lhe mostrar? Bem, então o desempenho deve ser melhorado por outra coisa.