Performance Vergleich von if-Abfragen mit mehreren Bedingungen

Status
Nicht offen für weitere Antworten.

Jagito

Mitglied
Hallo,

vielleicht kann mir jemand weiterhelfen.
Welche Modellierung ist schneller? (a,b,c,d sind int-Werte)

Java:
if(a> 1 && b>2 && c>2 && d<5) {
tuwas();
}
else {
 if ((a< 1 && b<2 && c<2 && d>5)
 tuwasanderes();
}

oder die folgende, wenn ich die Bedingungen in einzelne if-Schleifen zerlege
Java:
   if(a> 1){
      if (b<2) {
         if (c<2){
            if(d>5){
				tuwas();
				}
			else {}
		 else {}		}
	  else {} 		 }
	  }
	else{
		if (b>2) {
          if (c>2){
            if(d<5){
				tuwasanderes();
			}
		  }
		}
	}

Ist dahingehend wichtig, da mein Algorithmus ca. 10 E12 mal die if-Schleife durchlaufen wird, und da machen auch kleinere Zeitunterschiede einen Unterschied.
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
die Bedingungen sind übrigens nicht gleich,
bei a == 1 ist im obigen Fall kein Durchkommen,
im unteren schon

man kann grob annehmen, dass die Verknüpfung irrelevant ist,
allein schon die Vergleiche dürften deutlich mehr Zeit kosten,

im Vergleich aber zu irgendeinem selbst leeren Methodenaufruf sind die if-Verknüpfungen + Vergleiche praktisch kein Faktor mehr,
von einer gefüllten Methode mit gewissen Aktionen ganz zu schweigen,

interessant wäre das also höchstens, wenn tuwas()/ tuwasanderes() praktisch nie drankommt,
und auch dann müsste man wieder drauf achten, dass der Code in einer anderen Methode drinsteht, etwa in einer Schleife,
sonst hätte man einen Methodenaufruf zu diesem Code hin, der wieder mehr kostet als alles andere

auch wo die Variablen her kommen, ob sie final sind oder Klassenattribute mit Vererbung usw.
kann viel mehr Arbeit bereiten, lieber nicht über sowas genauer nachdenken,

was muss man eigentlich 10^12x ausführen?
wenn vorher die Variablen neu belegt werden oder sonst ein Code ausgeführt wird, dann ist das noch etwas, was sicher die 100fache Zeit dauert,

viel tiefer als einfache Kontrollstrukturen oder Zahl-Vergleiche kann man kaum sinken
 
Zuletzt bearbeitet von einem Moderator:

Jagito

Mitglied
Danke für die Antwort SlaterB.
Die Methoden tuwas()/ tuwasanderes() kommen häufig genug vor. Daher ist meine Frage gelöst :D

Es handelt sich um ein Netzwerkflussproblem von ca. 170 Knoten, wobei das Netzwerk symmetrisch ist und jeder Knoten genau zwei Vorgänger und Nachfolgerknoten besitzt.
Wenn man alle möglichen Kombinationen (unter Berücksichtigung gewisser Nebenbedingungen) betrachtet, erhält man rund 10^12 verschiedene Wege von Quelle zu Senke. Diese werden im Laufe des Algorithmus alle abgefragt, ob sie nicht von einem anderen Weg dominiert werden und daher gelöscht werden können.
 
B

bygones

Gast
klingt fuer mich bisschen eher nach nicht oop - wenn man ueber primitive werte alle kombinationen per if abfragen will / muss.

ansonsten wie slater schon sagte sind die beiden versionen semantisch untersch.

leserlich ist die erste zu vorziehen

performance ist meist so was von unwichtig, dass man sich darueber nicht mal ansatzweise den kopf zerbrechen soll.

Leserlichkeit >>>>> Performanz
 
S

SlaterB

Gast
stand anfangs sogar im Titel und eine Antwort auch schon, hatte L-ectron-X dann aufgeräumt, wohl nicht genug
 

0x7F800000

Top Contributor
wie du das hinschreibst dürfte von der performance her egal sein.

Allerdings macht es evtl. einen unterschied, in welcher reihenfolge du etwas hinschreibst:
Java:
if(sehrSeltenErfüllt && fastImmerErfüllt){
   ...
}
sollte imho schneller laufen, als die äquivalente Bedingung
Java:
if(fastImmerErfüllt && sehrSeltenErfüllt){
   ...
}
weil man im ersten Fall fast immer nur 1 vergleich macht, und im zweiten Fall fast immer 2. Das könnte bei vielen kostenspieligen Vergleichen ins Gewicht fallen.
 
S

SlaterB

Gast
die Frequenz der Erfüllungen reicht nicht, der Aufwand der Prüfung muss auch mit rein

lieber
if(fastImmerErfüllt * 1ms && sehrSeltenErfüllt * 1min){
als
if(sehrSeltenErfüllt * 1min && fastImmerErfüllt * 1ms){
;)
 

Marco13

Top Contributor
Dass man die leeren elses weglassen sollte, ist klar.

Oh ja, während Andrey diese Erkenntnis schon ganz abstrakt formuliert hat, habe ich sie mal konkret ausgetestet.


Ich glaube nicht, dass der Unterschied zwischen einer einzelnen if-Abfrage und einer geschachtelten in der Praxis wirklich relevant ist (aufgrund der von SlaterB schon genannten Punkte). Bei eine Microbenchmark, sieht man, nachdem der JIT angesprungen ist, zwar einen (für mich überraschend deutlichen) Vorteil für die einzelne If-Abfrage, aber es sollte klar sein, dass dessen Aussagekraft für die Praxis wegen der trivialen Operationen gegen 0 geht.

Und wie Andrey schon gesagt hat: Hilfreicher wäre vermutlich, bei einem repräsentativen Testlauf (sofern es den gibt) zu überprüfen, welche der Abfragen am häufigsten für einen frühen Abbruch verwendet werden kann.

Java:
class IfTest
{
    private static long case0 = 0;
    private static long case1 = 0;

    public static void main(String args[])
    {
        long before = 0;
        long after = 0;


        for (int passes=10000; passes<100000; passes+=10000)
        {
            for (int runs=100000; runs<=1000000; runs+=100000)
            {
                before = System.nanoTime();
                test_D_single(passes, runs);
                after = System.nanoTime();
                System.out.println("passes "+passes+" runs "+runs+" case0 "+case0+" case1 "+case1+" test_D_single "+((after-before) / 1000000));

                before = System.nanoTime();
                test_D_nested(passes, runs);
                after = System.nanoTime();
                System.out.println("passes "+passes+" runs "+runs+" case0 "+case0+" case1 "+case1+" test_D_nested "+((after-before) / 1000000));

                before = System.nanoTime();
                test_A_nested(passes, runs);
                after = System.nanoTime();
                System.out.println("passes "+passes+" runs "+runs+" case0 "+case0+" case1 "+case1+" test_A_nested "+((after-before) / 1000000));
            }
        }
    }


    private static void test_D_single(int passes, int runs)
    {
        case0 = 0;
        case1 = 0;

        for (int j=0; j<passes; j++)
        {
            for (int i=0; i<runs; i++)
            {
                countCaseSingle(0,0,0,10);
            }
        }
    }

    private static void test_D_nested(int passes, int runs)
    {
        case0 = 0;
        case1 = 0;

        for (int j=0; j<passes; j++)
        {
            for (int i=0; i<runs; i++)
            {
                countCaseNested(0,0,0,10);
            }
        }
    }

    private static void test_A_nested(int passes, int runs)
    {
        case0 = 0;
        case1 = 0;

        for (int j=0; j<passes; j++)
        {
            for (int i=0; i<runs; i++)
            {
                countCaseNested(10,0,0,0);
            }
        }
    }


    public static void countCaseSingle(int a, int b, int c, int d)
    {
        if(a> 1 && b>2 && c>2 && d<5)
        {
            case0++;
        }
        else if (a< 1 && b<2 && c<2 && d>5)
        {
            case1++;
        }
    }


    public static void countCaseNested(int a, int b, int c, int d)
    {
        if (a < 1)
        {
            if (b < 2)
            {
                if (c < 2)
                {
                    if (d > 5)
                    {
                        case1++;
                    }
                }
            }
        }
        else
        {
            if (b > 2)
            {
                if (c > 2)
                {
                    if (d < 5)
                    {
                        case0++;
                    }
                }
            }
        }
    }

}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Performance-Vergleich mit C++ Java Basics - Anfänger-Themen 55
O HashTable kann ohne Performance-Verlust in Multithreaded-Anwendungen eingesetzt werden. Java Basics - Anfänger-Themen 6
N Java-Performance messen Java Basics - Anfänger-Themen 1
P Priority Queue Performance Java Basics - Anfänger-Themen 3
P Performance Array und Liste Java Basics - Anfänger-Themen 13
S Performance von byte[], short[], int[]..? Java Basics - Anfänger-Themen 24
I Erste Schritte Resource Bundle - Alles in einem File oder mehrere? => Faktor Performance Java Basics - Anfänger-Themen 2
E Hilfe zur Performance Verbesserung gesucht Java Basics - Anfänger-Themen 1
G Performance - höhere Anzahl Swing Elemente Java Basics - Anfänger-Themen 5
S Performance-/Stress Test für Webanwendung Java Basics - Anfänger-Themen 2
R Datei kopieren: Performance erhöhen Java Basics - Anfänger-Themen 10
S Wie performance lastig sind rekursionen Java Basics - Anfänger-Themen 13
N Bessere Performance durch final: wann denn überhaupt? Java Basics - Anfänger-Themen 28
J Softwaresynthesizer Performance? Java Basics - Anfänger-Themen 11
I Anzahl einer Liste (Performance) Java Basics - Anfänger-Themen 2
S Performance HashMap<=>Array Java Basics - Anfänger-Themen 17
J Arrays erweitern - Performance vs Speicherverbrauch Java Basics - Anfänger-Themen 6
M Einträge in Dateien zählen - Performance-Problem Java Basics - Anfänger-Themen 10
S unterschied in performance Java Basics - Anfänger-Themen 4
hdi Worst-Performance-Award für Arbeiten mit ListModel Java Basics - Anfänger-Themen 7
hdi Performance Frage (Threads,Swing) Java Basics - Anfänger-Themen 4
V Performance Lesen und Schreiben aus/in Streams Java Basics - Anfänger-Themen 4
C große Matrizen, Performance, (Pointer?) Java Basics - Anfänger-Themen 6
G import .; - Speicherauslastung, Performance Java Basics - Anfänger-Themen 14
G Performance Java Basics - Anfänger-Themen 18
C Performance IO vs. NIO Java Basics - Anfänger-Themen 5
S dynamic arrays/ performance Java Basics - Anfänger-Themen 2
RaoulDuke Arbeitsweise / Speichernutzung / Performance Java Basics - Anfänger-Themen 10
heinrich172 Methoden Trotz gleichem Element stimmt Vergleich nicht? Java Basics - Anfänger-Themen 7
U Interface als PAramter (Vergleich) und ein Error Java Basics - Anfänger-Themen 9
K Erste Schritte Wie schnell ist LinkedHashMap im Vergleich zur ArrayList, wenn alle Entries durchlaufen werden? Java Basics - Anfänger-Themen 47
K Rekursiver Vergleich von Textmuster und Text Java Basics - Anfänger-Themen 2
Zeppi Vergleich von Array-Inhalten Java Basics - Anfänger-Themen 14
Lena_2611 Vergleich von Array1 Index mit Array2 Wert und erzeugen eines neues Arrays Java Basics - Anfänger-Themen 8
B Date - Vergleich (equals / after) ? Java Basics - Anfänger-Themen 3
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
W Vergleich von DatenPaketen Java Basics - Anfänger-Themen 6
B String vergleich Java Basics - Anfänger-Themen 3
C Probleme mit String-Vergleich Java Basics - Anfänger-Themen 4
K File-Name Vergleich Java Basics - Anfänger-Themen 2
V Fließkommazahlen Vergleich Java Basics - Anfänger-Themen 7
J Vergleich Java Basics - Anfänger-Themen 2
N Vergleich von Strings schlägt fehl.. Java Basics - Anfänger-Themen 5
S Vergleich zweier ArrayLists mit Ausgabe an dritte ArrayList Java Basics - Anfänger-Themen 5
T Vergleich und Ausgabe von Zahlen Java Basics - Anfänger-Themen 1
G Klassen Vergleich zweier Klassen Java Basics - Anfänger-Themen 23
J Fehler bei Vergleich auf den grössten Wert Java Basics - Anfänger-Themen 2
A Do-While Schleife; int vergleich Java Basics - Anfänger-Themen 2
G Wieviel kostet der Zugriff auf Objektattribute im Vergleich zur Erstellung von vars in Methode? Java Basics - Anfänger-Themen 11
T Input/Output String-Vergleich schlägt fehl Java Basics - Anfänger-Themen 7
W Konvertierung und Vergleich unterschiedlicher Zeitformate Java Basics - Anfänger-Themen 11
L Vergleich zweier Variablen, mit Abweichung Java Basics - Anfänger-Themen 3
N Methoden Methode zum Vergleich zweier Geburtstage Java Basics - Anfänger-Themen 5
W Vergleich mit If-Abfrage nur für Zahlen bis 07 möglich - Warum? Java Basics - Anfänger-Themen 7
M String-Vergleich und NullPointerException Java Basics - Anfänger-Themen 4
M Vergleich zweier Array Stellen mit equals/NullpointerException Java Basics - Anfänger-Themen 9
L PW-Vergleich Java Basics - Anfänger-Themen 5
N Vergleich zweier String Arrays scheitert Java Basics - Anfänger-Themen 3
S Vergleich von Listen Java Basics - Anfänger-Themen 6
J vergleich von arrays (benötige Hilfe/Denkanstoß) Java Basics - Anfänger-Themen 16
V Einfacher vergleich von Arrays geht schief Java Basics - Anfänger-Themen 2
T Operatoren Multiplikation nur mit Addition, Subtraktion und Vergleich Java Basics - Anfänger-Themen 29
N Methoden Array vergleich funzt nicht Java Basics - Anfänger-Themen 8
B Char-Vergleich Sonderzeichen Java Basics - Anfänger-Themen 6
S Vergleichsmethode zum Objekt-Vergleich mit < und > Java Basics - Anfänger-Themen 4
F Problem bei Vergleich Java Basics - Anfänger-Themen 3
S File vergleich - Junit Java Basics - Anfänger-Themen 6
P String-Vergleich Java Basics - Anfänger-Themen 3
S Multiplikation durch Addition, Subtraktion und Vergleich von Zahlen Java Basics - Anfänger-Themen 14
W Vergleich ob Buchstabe in einem Wort enthalten ist Java Basics - Anfänger-Themen 3
C String Objekte Vergleich je nach Instanzierung unterschiedlich!!?!! Java Basics - Anfänger-Themen 4
R String-Vergleich Java Basics - Anfänger-Themen 15
C Variablen Vergleich funktioniert nicht Java Basics - Anfänger-Themen 11
J Erste Schritte Vergleich der String-Objekte Java Basics - Anfänger-Themen 17
B Zwei verschiedene Daten vergleich Java Basics - Anfänger-Themen 2
A Variablen Vergleich Java Basics - Anfänger-Themen 5
P Erste Schritte vergleich substring und string Java Basics - Anfänger-Themen 4
G Date - Calender | "Vergleich" Java Basics - Anfänger-Themen 3
M Vergleich mit Toleranz Java Basics - Anfänger-Themen 7
B Objekt Vergleich - Unterschiede ausgeben Java Basics - Anfänger-Themen 4
P Vergleich mit Variablen Java Basics - Anfänger-Themen 6
Y Java Programm URL und String Vergleich! Java Basics - Anfänger-Themen 4
K Vergleich von variable und array Java Basics - Anfänger-Themen 9
L vergleich zweier texte Java Basics - Anfänger-Themen 18
H Beim Vergleich/Sortieren mehr als zwei Objekte berücksichtigen Java Basics - Anfänger-Themen 14
B Vergleich zweier Objekte durch "Hashfunktion" Java Basics - Anfänger-Themen 12
P Vergleich von Enums Java Basics - Anfänger-Themen 4
S String Vergleich funktioniert nicht Java Basics - Anfänger-Themen 3
A String-Vergleich geht nicht Java Basics - Anfänger-Themen 2
U Automatenprüfung in Java implementieren — String Vergleich klappt nicht Java Basics - Anfänger-Themen 40
F Methoden Vergleich von int Zahlen Java Basics - Anfänger-Themen 16
F Login Passwort-Vergleich Java Basics - Anfänger-Themen 12
N Vergleich per equals Java Basics - Anfänger-Themen 5
Z XML Vergleich Java Basics - Anfänger-Themen 20
S Herunterladen von Dateien mit Vergleich Java Basics - Anfänger-Themen 6
L Problem String-Vergleich Java Basics - Anfänger-Themen 2
E Objekte-Vergleich Java Basics - Anfänger-Themen 6
Y Datentypen String vergleich Java Basics - Anfänger-Themen 3
R Vergleich von Objekten anhand variierender Kriterien Java Basics - Anfänger-Themen 5
K Datentypen Arrays in Java - Adress-Arithmetik im Vergleich zu Listen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben