Ist es möglich, viele "Oder"-Zeichen (||) in Bedingungen zu vermeiden, die dieselbe Aktion verursachen? - Seite 2

 
TarasBY:

Sie können auf diese Weise auch Berechnungen optimieren:

Danke! Man hat mir bereits geraten, bool Avals zu verwenden, und Vinin hat mich gewarnt, dass dies zu einer erheblichen Verlangsamung führen würde. Und nachdem ich einen EA fast fertiggestellt habe, suche ich nach etwas anderem, das ich im Code optimieren kann. Ich habe es bereits geschafft, die Laufzeit des Testers für alle Zecken in 12 Monaten von 40 Minuten auf 13 Minuten zu reduzieren!
 

Es wurde schon oft gesagt: es gibt keine Abkürzung in MCL, if(a||b|||c||d||e){} alle Bedingungen werden geprüft.

Der Ausweg sind Nistbedingungen:

if(a){if(b){if(c){}}} in diesem Fall erfolgt der Ausstieg bei der ersten passenden Bedingung

Aber auch die Verschachtelung ist nicht unendlich, die flexibelste Lösung ist, die Bedingungen in einer Schleife mit einem Ausgang zu prüfen:

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: Das ist möglich, aber die Geschwindigkeit nimmt stark ab.
Victor, gelten Ihre Warnungen (über die Verwendung einer boolschen Variable) auch für meine Optimierungsoptionen?!
 
FAQ:

Es wurde schon oft gesagt: es gibt keine Abkürzung in MCL, wenn (a||b|||c||d||e){} werden alle Bedingungen geprüft.

Der Ausweg sind Nistbedingungen:

if(a){if(b){if(c){}}} in diesem Fall erfolgt der Ausstieg bei der ersten passenden Bedingung

Aber auch die Verschachtelung ist nicht unendlich, die flexibelste Lösung ist, die Bedingungen in einer Schleife mit einem Ausgang zu prüfen:

Herzlichen Dank! Ich werde es ausprobieren! Kannst du Spanisch? Denn "bla, bla, bla" kommt von dem Verb "sprechen" (hablar)!
 
Nein, aber ich bin gut in Olban :))
 
FAQ:
Nein, aber ich kenne Olbanian gut :))

Die Verschachtelung von Bedingungen if(a){if(b){if(c){}}} ist nicht gut, da sich alle Bedingungen gegenseitig ausschließen, aber irgendetwas funktioniert nicht mit boolean. Wahrscheinlich und höchstwahrscheinlich mache ich etwas falsch. Bisher habe ich es dabei belassen, für jede Bedingung eine Doppelvariable zu erstellen und sie in dieselbe if() mit 4 "oder" einzufügen. Wie ich erwartet hatte, hat sich dies nicht auf die Geschwindigkeit der Tests ausgewirkt. Gleiche 13 Minuten für alle Zecken für 12 Monate.

Oder heißt diese Sprache vielleichtOblansky?

 
borilunad:

Verschachtelte Bedingungen if(a){if(b){if(c){}} sind nicht gut, da sich alle Bedingungen gegenseitig ausschließen. Wahrscheinlich und höchstwahrscheinlich machen Sie etwas falsch.


Alles ist gut, man muss sich nur an einige Identitäten aus der Booleschen Arithmetik erinnern, zum Beispiel: a || b = !( !a && !b ). Indem wir von der Konjunktion zur Disjunktion wechseln, können wir die Prüfung der ODER-Bedingung durch eine konsekutive (verschachtelte) Prüfung der UND-Bedingungen ersetzen: zum Beispiel, wenn (a || b || c), wie TarasBY oben richtig geschrieben hat, zu

bool M = true;

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

if(!M) {Action;}

Dieser Code ist im Allgemeinen schneller als der ursprüngliche Code mit ||, da er nur so lange ausgeführt wird, bis eine der Bedingungen in der Liste wahr ist, d. h. bis die gesamte ODER-Operation zu TRU führt.

 
alsu:

Alles ist gut, man muss sich nur an einige Identitäten aus der Booleschen Arithmetik erinnern, zum Beispiel: a || b = !( !a && !b ). Indem wir von der Konjunktion zur Disjunktion wechseln, können wir die Prüfung der ODER-Bedingung durch eine konsekutive (verschachtelte) Prüfung der UND-Bedingungen ersetzen: zum Beispiel, wenn (a || b || c), wie TarasBY oben richtig geschrieben hat, zu

Dieser Code ist im Allgemeinen schneller als der ursprüngliche Code mit ||, weil er nur so lange ausgeführt wird, bis eine der Bedingungen in der Liste wahr ist, d. h. bis die gesamte ODER-Operation ein TRU-Ergebnis liefert.

Wir können auch schneller werden, wenn wir z.B. wissen, dass Bedingung A im Durchschnitt häufiger ausgeführt wird als C und C häufiger als B, dann sollten wir sie in dieser Reihenfolge setzen: if(!a){if(!c)if{(!b) M=false;}}
 
alsu:

Alles ist gut, man muss sich nur an einige Identitäten aus der Booleschen Arithmetik erinnern, zum Beispiel: a || b = !( !a && !b ). Indem wir von der Konjunktion zur Disjunktion wechseln, können wir die Prüfung der ODER-Bedingung durch eine konsekutive (verschachtelte) Prüfung der UND-Bedingungen ersetzen: zum Beispiel, wenn (a || b || c), wie TarasBY oben richtig geschrieben hat, zu

Dieser Code ist im Allgemeinen schneller als der ursprüngliche Code mit ||, da er nur so lange ausgeführt wird, bis eine der Bedingungen in der Liste wahr ist, d. h. bis die gesamte ODER-Operation ein TRU-Ergebnis liefert.

Vielen Dank für Ihre Teilnahme! Ich habe 5 verschiedene, aber gleichwertige Bedingungen, und wenn keine Bedingung wahr ist, wartet der EA, bis eine von ihnen wahr ist. Daher erwies sich keine der Umsetzungsformen als besser, trotz meiner Bemühungen. Deshalb werde ich vorerst bei meinen "Torten" bleiben.
 
borilunad:
Vielen Dank für Ihre Teilnahme! Ich habe 5 verschiedene, aber gleiche Bedingungen, und wenn keine Bedingung erfüllt ist, wartet der EA darauf, dass eine von ihnen erfüllt wird. Daher hat sich trotz meiner Bemühungen keine einzige Form der Umsetzung als besser erwiesen. Deshalb bleibe ich vorerst bei meinen "Torten".
Auch das, was ich Ihnen gerade gezeigt habe? Nun, dann sollte die Leistung durch etwas anderes verbessert werden.
Grund der Beschwerde: