Binäre Operatoren

Ich wollte sehen, ob ihr aufpasst, oder generell diesen Beitrag lest. :wink:

Gefährlich, das so zu machen.

[QUOTE=CyborgBeta]Da Code geschrieben/gepostet wurde, bin ich jetzt auch dabei.

Man kann die schnelle Reihenfolge der Operanden in Ifs auch durch ein Programm bestimmen (wenn keine Seiteneffekte):
[spoiler]

 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication1;

/**
 * @author CB
 */
public class KurzesIf {

    static class KlasseMitMethode {
        int dauer = 50;
        int wahrs = 50;

        KlasseMitMethode(int dauer, int wahrs) {
            this.dauer = dauer;
            this.wahrs = wahrs;
        }

        boolean methode() {
            try {
                Thread.sleep(dauer);
            } catch (InterruptedException ie) {
                ie.printStackTrace();
            }
            return Math.random() * 100.0 < wahrs;
        }
    }
    
    private KlasseMitMethode[] kmm = new KlasseMitMethode[]{
        new KlasseMitMethode((int) (Math.random() * 100), (int) (Math.random() * 95)),
        new KlasseMitMethode((int) (Math.random() * 500), (int) (Math.random() * 75)),
        new KlasseMitMethode((int) (Math.random() * 900), (int) (Math.random() * 55))
    };

    public KurzesIf() {
        for (int i = 0; i < kmm.length; i++) {
            System.out.printf("%c() , dauer=%03d , wahrs=%03f%n", 'A' + i, kmm**.dauer, kmm**.wahrs / 100.0);
        }
        System.out.println("");
    }

    private void bt(int index, int[] indexes) {
        if (index == indexes.length) {
            kmmAufrufen(indexes);
        }
        a:
        for (int i = 0; i < kmm.length; i++) {
            // insert your idea here ...
            // insert your idea here ...
            // insert your idea here ...
            // insert your idea here ...
            // insert your idea here ...
            // insert your idea here ...
            // insert your idea here ...
        }
    }

    private void kmmAufrufen(int[] indexes) {
        System.out.print("if ( ");
        for (int index : indexes) {
            System.out.print((char) (index + 'A') + "() && ");
        }
        System.out.println(") { :");
        boolean b;
        long t1 = System.currentTimeMillis();
        if (kmm[indexes[0]].methode() && kmm[indexes[1]].methode() && kmm[indexes[2]].methode()) {
            b = true;
        } else {
            b = false;
        }
        long t2 = System.currentTimeMillis();
        System.out.printf("b=%b , t=% 3d%n%n", b, t2 - t1);
    }

    public static void main(String[] args) {
        new KurzesIf().bt(0, new int[3]);
    }
}```

Zeile 69 bis 73 muss noch angepasst werden, es kann ja nicht nur A, B, C geben. Aber ihr wisst, was mit if-else- gemeint ist.

[/spoiler]


Ergebnis:


run:
A() , dauer=069 , wahrs=0,860000
B() , dauer=229 , wahrs=0,330000
C() , dauer=352 , wahrs=0,420000

if ( A() && B() && C() && ) { :
b=false , t= 298

if ( A() && C() && B() && ) { :
b=true , t= 650

if ( B() && A() && C() && ) { :
b=false , t= 229

if ( B() && C() && A() && ) { :
b=false , t= 229

if ( C() && A() && B() && ) { :
b=false , t= 352

if ( C() && B() && A() && ) { :
b=true , t= 650

BUILD SUCCESSFUL (total time: 2 seconds)



B(), der unwahrscheinliche, aber mittelschnelle Fall (Methodenaufruf), sollte nach vorne geschrieben werden.

Bis mooorgen...[/QUOTE]

ähm ich weiß zwar nicht genau wie du jetzt darauf kommst, aber z.b. in deinem versuch hast du nicht getestet was ist wenn b zutrifft ob dann b vorne noch was bringt oder was wäre wenn a vorne steht und a false ist,... das hast du alles in deinem "tollen Programm" nicht getestet 
**ABER** versuchst mittels deiner gesammelten Daten irgend ein Ergebnis zu deuten.

[QUOTE=Unregistered]ähm ich weiß zwar nicht genau wie du jetzt darauf kommst, aber z.b. in deinem versuch hast du nicht getestet was ist wenn b zutrifft ob dann b vorne noch was bringt oder was wäre wenn a vorne steht und a false ist,… das hast du alles in deinem „tollen Programm“ nicht getestet
ABER versuchst mittels deiner gesammelten Daten irgend ein Ergebnis zu deuten.[/QUOTE]

Das ist ja das Problem. :wink: Eigentlich müsste man jede der 6 Kombinationen öfters aufrufen und dann mitteln. Allerdings war dieser eine Aufruf (1x 6 Aufrufe) auch schon eindeutig, allgemeingültig, repräsentativ. :wink:

das war wohl als Scherz gemeint, im Dauertest Reihenfolge knapp bestätigt,

interessanter ist es wenn noch knapper, wenn A auf Dauer 50 runtergeht

Programm
[spoiler]class KurzesIf {

static class KlasseMitMethode    {
    int dauer = 50;
    int wahrs = 50;

    KlasseMitMethode(int dauer, int wahrs)     {
        this.dauer = dauer;
        this.wahrs = wahrs;
    }

    boolean methode()   {
        return Math.random() * 100.0 < wahrs;
    }
}

private KlasseMitMethode[] kmm = new KlasseMitMethode[]
    {new KlasseMitMethode((int)(50), (int)(86)), new KlasseMitMethode((int)(229), (int)(33)),
     new KlasseMitMethode((int)(352), (int)(42))};

public KurzesIf()  {
    for (int i = 0; i < kmm.length; i++)  {
        KlasseMitMethode k = kmm**;
        double fac = (100.0 - k.wahrs) / k.dauer;
        System.out.printf("%c() , dauer=%03d , wahrs=%03f, fact=%03f%n", 'A' + i, k.dauer, k.wahrs / 100.0, fac);
    }
    System.out.println("");
}

private void bt()  {
    kmmAufrufen(0, 1, 2);
    kmmAufrufen(1, 0, 2);
    kmmAufrufen(1, 2, 0);
    kmmAufrufen(0, 2, 1);
    kmmAufrufen(2, 1, 0);
    kmmAufrufen(2, 0, 1);
}

private void kmmAufrufen(int... indexes)  {
    for (int index : indexes)
        System.out.print((char)(index + 'A') + "() && ");
    long countD = 0;
    long countB = 0;
    for (int n = 0; n < 600000; n++)  {
        boolean b = true;
        for (int i : indexes)   {
            KlasseMitMethode k = kmm**;
            countD += k.dauer;
            if (!k.methode())   {
                b = false;
                break;
            }
        }
        if (b) countB++;
    }
    System.out.println(" -> " + countB + ", Dauer: " + countD);
}

public static void main(String[] args)  {
    new KurzesIf().bt();
}

}
[/spoiler]

Ausgabe:


A() , dauer=050 , wahrs=0,860000, fact=0,280000
B() , dauer=229 , wahrs=0,330000, fact=0,292576
C() , dauer=352 , wahrs=0,420000, fact=0,164773

A() && B() && C() &&  -> 71807, Dauer: 208334635
B() && A() && C() &&  -> 71412, Dauer: 207175090
B() && C() && A() &&  -> 71177, Dauer: 211216528
A() && C() && B() &&  -> 71474, Dauer: 261349590
C() && B() && A() &&  -> 71586, Dauer: 273198911
C() && A() && B() &&  -> 71773, Dauer: 273478271

(erster Wert Anzahl boolean true von 600k Tests, kleine Kontrolle, sollte immer etwa gleich sein, zweiter Wert die Dauer nach Zählung, nicht so lange sleep :wink: )

mit dem Factor Gegenwahrscheinlichkeit/ Dauer (für A 14/50) kann man wohl den vordersten bzw. auch immer die optimale Reihenfolge bestimmen (bisher kein Gegenbeispiel gefunden…),
bei A und B vorne ist A oder B führend kaum messbar, halbes Prozent Unterschied

interessanter wird es zusammen mit dem langsamen C:
dass A vor C vor B fast so langsam ist wie die übelsten Varianten, mit C anzufangen, während B vor C vor A dagegen fast auch optimal ist,
ist direkt nicht unbedingt zu sehen, schon gar nicht aus den fast gleichen Faktoren für A und B

manuell erklärbar ist es, A verhindert C nur zu 14%, das gute B hilft an letzter Stelle gar nicht mehr,
andersrum kann B das schlimme C zu 67% vermeiden

gibt es einen Einzel-Faktor der sowas gut sichtbar machen würde?

Ich hoffe du versuchst nie eine wissenschaftliche Karriere zu machen

Sagen wir so, ich bin imstande, eine „Abkürzung“ zu finden, du hingegen nicht, und bist deshalb außerstande, eine wissenschaftliche Karriere zu wählen. Außerdem ist es eine Frechheit, unangemeldet andere langjährige User zu beleidigen. Oder anders, du kannst nichts, außer andere beleidigen. In den Staub, bitte. Thx.