同じ動作をさせる条件において、多くの "or"(|)を避けることは可能でしょうか? - ページ 2

 
TarasBY:

また、この方法で計算を最適化することもできます。

ありがとうございます。すでにbool Avalsを使うようにアドバイスされ、Vininからは「マジで遅くなる」と警告されました。そして、EAをほぼ完成させた後、コードで最適化するために何か他のものを探しています。すでに、12ヶ月で全てのティックのテスターの稼働時間を40分から13分に短縮することに成功しているのです
 

何度も言われていることですが、MCLに近道はなく、if(a||b||c||d||e){}すべての条件がチェックされます。

出口は巣立ちの条件です。

if(a){if(b){if(c){}} この場合、最初にマッチした条件で終了します。

しかし、ネストは無限ではありません。最も柔軟な解決策は、ループ内で条件をチェックし、終了することです。

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: できますが、スピードはかなり落ちます。
Victorさん、(bool変数の使用に関する)あなたの警告は、私の最適化オプションにも適用されるのでしょうか?
 
FAQ:

何度も言われていることですが、MCLに近道はなく、if(a||b||c||d||e){}ですべての条件がチェックされます。

出口は巣立ちの条件です。

if(a){if(b){if(c){}} この場合、最初にマッチした条件で終了します。

しかし、ネストは無限ではありません。最も柔軟な解決策は、ループ内で条件をチェックし、終了することです。

ありがとうございました。試してみます!スペイン語は話せますか?だって、「ブラ、ブラ、ブラ」は「話す」(hablar)という動詞から来ているんですもの!
 
いや、でもオルバンは得意なんです :))
 
FAQ:
いや、でもオルバニアはよく知ってるよ :))

if(a){if(b){if(c){}} という条件のネストは、すべての条件が相互に排他的であるため、よくないのですが、booleanでは何かうまくいきません。おそらく、そして最も可能性が高いのは、私が何か間違ったことをしていることです。今のところ、条件ごとに変数doubleを作って、同じif()に4つの "or "で貼り付けるところで止まっています。予想通り、テストのスピードに影響は出ていません。12ヶ月で全てのティックに同じ13分。

それとも、この言語がオブラートと 呼ばれているのでしょうか?

 
borilunad:

入れ子になった条件 if(a){if(b){if(c){}} は、すべての条件が相互に排他的であるため、よくありません。おそらく、そして最も可能性が高いのは、何か間違ったことをしていることです。


例えば、a || b = !( !a && !b ) のように、ブール演算の恒等式を覚えておけば、すべてうまくいきます。そして、接続詞から論理和に変えることで、OR条件のチェックを連続した(入れ子の)AND条件のチェックに置き換えることができる。例えば、(a || b || c)が、上でTarasBYが正しく書いたように、次のようになる場合だ。

bool M = true;

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

if(!M) {Action;}

このコードは、リストの条件の1つが真になるまで、すなわち全体のOR演算がTRUになるまでしか実行されないので、一般に||を用いた元のコードよりも高速である。

 
alsu:

例えば、a || b = !( !a && !b ) のように、ブール演算の恒等式を覚えておけば、すべてうまくいきます。そして、接続詞から論理和に変えることで、OR条件のチェックを連続した(入れ子の)AND条件のチェックに置き換えることができる。例えば、(a || b || c)が、TarasBYが上で正しく書いたように、次のようになる場合だ。

このコードは、リストの条件の1つが真になるまで、すなわち全体のOR演算がTRU結果をもたらすまでしか実行されないので、一般に||を用いた元のコードよりも高速である。

また、例えば、条件AがCよりも平均的に多く実行され、CがBよりも多く実行されることが分かっている場合、次のような順番で並べると高速化できます。 if(!a){if(!c)if{(!b)M=false;}}。
 
alsu:

例えば、a || b = !( !a && !b ) のように、ブール演算の恒等式を覚えておけば、すべてうまくいきます。そして、接続詞から論理和に変えることで、OR条件のチェックを連続した(入れ子の)AND条件のチェックに置き換えることができる。例えば、(a || b || c)が、上でTarasBYが正しく書いたように、次のようになる場合だ。

このコードは、リストの条件の1つが真になるまで、すなわち全体のOR演算がTRU結果をもたらすまでしか実行されないので、一般に||を用いた元のコードよりも高速である。

ご参加ありがとうございました。5つの異なるが同じ値の条件を持っていて、どの条件も真でなければ、EAはそのうちの1つが実行されるのを待ちます。そのため、せっかく導入したのに、どの形も良くなかったということになります。ですから、今は "パイ "にこだわります。
 
borilunad:
ご参加ありがとうございました。5つの異なるが等しい条件を持っていて、どの条件も満たされない場合、EAはそのうちの1つが満たされるのを待つのです。そのため、私が努力しても、どのような形でも良いというわけではありません。ですから、今は "パイ "にこだわります。
今、お見せしたものも?じゃあ、何か別の方法で性能を向上させるべきですね。