Rechenzeit: mehrere if-Abfragen



  • Hallo,

    ich habe folgendes Problem:

    Ich habe in meinem Quelltext eine if-schleife, die sehr oft aufgerufen wird:

    if (a!=0 && b!=0 && c!=0 && d!=0)
    

    Die Rechenzeit erhöht sich durch diese Abfrage erheblich. Falls statt 4 Bedingungen nur die ersten beiden verwendet werden ist dies nicht der Fall. Erst ab 3 Bedingungen erhöht sich die Rechenzeit. Wie kann ich das Problem lösen?

    Denn werde desweiteren noch mehr if-Abfragen erstellen müssen:

    if (a=0 && b!=0 && c!=0 && d!=0)
    
    if (a=0 && b=0 && c!=0 && d!=0)
    

    usw. um alle Kombinationen durchzuspielen

    Ich hoffe, ihr könnt mir weiterhelfen.

    viele Grüße,
    Eric



  • Keine Ahnung logisches UND von Allen oder die Summe muss auch Null ergeben, vielleicht hilft das?



  • Mit etwas mehr Kontext könnte man vielleicht etwas mehr Tipps geben.

    Jedenfalls wäre eine Möglichkeit die a,b,c,d in eine Bitmaske zu verbauen

    unsigned int mask = (a>0) & (b>0)<<1 & (c>0)<<2 & (d>0)<<3;
    

    und diese Maske dann für weitere Berechnung/Entscheidung verwenden. Hört sich eh so an, dass du eigentlich gar keine if-Abfragen willst (nicht Schleifen ;)), sondern dann ein switch-case-Konstrukt.

    switch (mask) {
    case 0xF:
    ...
    
    case 0x7:
    ...
    
    case 0x3:
    ...
    

  • Mod

    1. Ist das wirklich nötig? Falls ja, dann kommst du nicht drumrum, sondern kannst nur tricksen (siehe Punkt 2). Aber erfahrungsgemäß sind Abfragen dieser Art in innersten Schleifen meistens nicht nötig:
    - Weil man die Abfrage ganz oder teilweise auch außerhalb der Schleife hätte machen können
    - Weil man sich durch die Abfrage eine kurze ergebnislose Rechnung spart, die insgesamt weniger Zeit verschlungen hätte, als die Abfrage
    - Weil der Algorithmus an sich nicht optimal ist

    2. Optimierungen:
    - Prüfe zuerst die Bedingungen, die am ehesten falsch sind, um die Kurzschlusslogik optimal auszunutzen (das gilt für UND-Verknüpfungen, für ODER ist es umgekehrt). Wenn nämlich nach einem Term weiter links schon feststeht, was das Ergebnis des Gesamtausdrucks ist, dann wird der Rest gar nicht erst ausgewertet. Hier bedeutet dies, wenn a schon ungleiche 0 ist, dann werden b, c und d gar nicht angeguckt.
    - Den Trick von Gurkensalat probieren, falls deine Daten dafür geeignet sind
    - edit: Und noch weitere Tricks sind in der Zwischenzeit hinzu gekommen. Die auch probieren
    - Nochmal Punkt 1 angucken und nachdenken, ob das auch wirklich, wirklich, wirklich nötig ist.



  • Wieviele Durchläufe (1000, 10000, 100000) ergeben einen signifikanten Unterschied in der Rechenzeit? 😕 Optimierungen lohnen sich nur, wenn damit für den Anwender etwas erkennbar schneller wird. 🤡 Bei alten Dampfcomputern mit Interpretern war das einmal anders!


Log in to reply