Was ist der Unterschied zwischen Java 6 und 7, der ein Leistungsproblem verursachen würde?

Meine Allgemeine Erfahrung mit Java 7 sagt mir, dass es schneller ist als Java 6. Aber ich habe in genug Informationen, was mich glauben macht, dass dies nicht immer der Fall.

Das erste bit von Informationen, die kommt von Minecraft Snooper Daten gefunden hier. Meine Absicht war es, zu sehen, dass die Daten zu bestimmen, die Auswirkungen der unterschiedlichen Schalter verwendet, starten Sie Minecraft. Zum Beispiel wollte ich wissen, ob mit -Xmx4096m hatten einen negativen oder positiven Effekt auf die performance. Bevor ich bekommen konnte, da sah ich die andere version von Java verwendet wird. Es reicht vom 1,5-Entwickler mit 1.8. Im Allgemeinen erhöhen Sie die java-version sehen Sie einen Anstieg der fps-Leistung. In den verschiedenen Versionen von 1.6 Sie sehen auch diesem trend. Ganz ehrlich, ich hatte nicht erwartet, um zu sehen, wie viele verschiedene java-Versionen immer noch in der wilden, aber ich denke, die Leute nicht laufen die updates wie Sie sollen.

Einige Zeit, um den späteren Versionen des 1.6 bekommen Sie die höchste peeks. 1.7 führt über 10fps im Durchschnitt unterhalb der späteren Versionen von 1.6 aber immer noch höher als die frühen Versionen von 1.6. Auf ein Beispiel aus meinem eigenen system, es ist fast unmöglich, den Unterschied zu sehen, aber beim betrachten der größeren Probe ist es klar.

Zur Kontrolle für die Möglichkeit, dass jemand möglicherweise gefunden haben, die Magie Schalter für Java-I-control mit von nur, die Daten zu betrachten mit Keine Schalter übergeben wird. So würde ich einen angemessenen Kontrolle, bevor ich begann, mich auf die verschiedenen flags.

Ich verwarf das meiste, was ich zu sehen bekam, da dieser einige Magische Java 6, dass jemand einfach nur nicht teilen mit mir.

Nun arbeite ich schon an einem anderen Projekt, dass verlangt von mir, übergeben Sie ein array in einen InputStream verarbeitet werden, durch eine andere API. Zunächst verwendete ich ein ByteArrayInputStream da, es würde funktionieren out of the box. Wenn ich schaute auf den code, ist es mir aufgefallen, dass jede Funktion synchronisiert wurde. Da dies unnötig war für dieses Projekt schrieb ich mit der Synchronisierung entfernt. Ich habe dann beschlossen, dass ich wollte wissen, was die Allgemeinen Kosten für die Synchronisation war für mich in dieser situation.

Verspottet ich einen einfachen test, nur um zu sehen. Ich zeitlich alles mit System.nanoTime() und Java verwendet 1.6_20 x86 und 1.7.0-b147 AMD64, und 1.7_15 AMD64 und mit dem -server. Ich erwartet, dass die AMD64-version zu übertreffen, basierend auf Architektur allein und habe alle java-7 Vorteile. Ich schaute auf die 25 -, 50-und 75-Perzentile (blau,rot,grün). Aber 1.6 mit nicht -server-schlagen die Hosen Weg von jeder anderen Konfiguration.
Was ist der Unterschied zwischen Java 6 und 7, der ein Leistungsproblem verursachen würde?

Also meine Frage ist.
Was ist in der 1,6 -server-option, die Auswirkungen auf die Leistung, die ist auch standardmäßig auf 1,7?

Ich weiß, die meisten von der Geschwindigkeit Verbesserung in der 1.7 kam von säumigen einige der radikalen performance-Optionen in 1.6 auf, aber einer von Ihnen macht eine performance Unterschied. Ich weiß nur nicht, welche zu sehen.

public class ByteInputStream extends InputStream {

public static void main(String args[]) throws IOException {
    String song = "This is the song that never ends";
    byte[] data = song.getBytes();
    byte[] read = new byte[data.length];
    ByteArrayInputStream bais = new ByteArrayInputStream(data);
    ByteInputStream bis = new ByteInputStream(data);

    long startTime, endTime;

    for (int i = 0; i < 10; i++) {
        /*code for ByteInputStream*/
        /*
        startTime = System.nanoTime();
        for (int ctr = 0; ctr < 1000; ctr++) {
            bis.mark(0);
            bis.read(read);
            bis.reset();
        }
        endTime = System.nanoTime(); 

        System.out.println(endTime - startTime); 
        */

        /*code for ByteArrayInputStream*/
        startTime = System.nanoTime();
        for (int ctr = 0; ctr < 1000; ctr++) {
            bais.mark(0);
            bais.read(read);
            bais.reset();
        }
        endTime = System.nanoTime();

        System.out.println(endTime - startTime);
    }

}

private final byte[] array;
private int pos;
private int min;
private int max;
private int mark;

public ByteInputStream(byte[] array) {
    this(array, 0, array.length);
}

public ByteInputStream(byte[] array, int offset, int length) {
    min = offset;
    max = offset + length;
    this.array = array;
    pos = offset;
}

@Override
public int available() {
    return max - pos;
}

@Override
public boolean markSupported() {
    return true;
}

@Override
public void mark(int limit) {
    mark = pos;
}

@Override
public void reset() {
    pos = mark;
}

@Override
public long skip(long n) {
    pos += n;
    if (pos > max) {
        pos = max;
    }
    return pos;
}

@Override
public int read() throws IOException {
    if (pos >= max) {
        return -1;
    }
    return array[pos++] & 0xFF;
}

@Override
public int read(byte b[], int off, int len) {
    if (pos >= max) {
        return -1;
    }
    if (pos + len > max) {
        len = max - pos;
    }
    if (len <= 0) {
        return 0;
    }
    System.arraycopy(array, pos, b, off, len);
    pos += len;
    return len;
}

@Override
public void close() throws IOException {
}

}//end class
Kommentar zu dem Problem
+1 für eine sehr schöne Grafik und gut dokumentierte Frage. Kommentarautor: Philip Tenn
Ich habe die gegenteilige Meinung. Es gibt eine Menge von Floskeln hier, und eine hübsche Grafik, aber keine wirklichen Inhalte. Wenn Sie hatte gerade gezeigt, Ihren code und beschrieb die Ergebnisse in einer Tabelle, mehr Menschen würden in der Lage sein, um Ihnen zu helfen. Wie es ist, alles, was Sie wahrscheinlich zu bekommen ist Vermutungen. -1, wenn ich könnte. Kommentarautor: parsifal
Was ist auf der Y-Achse? Haben Sie gemessen mehreren wiederholten Aufgaben, nicht ein einziger? Sind Sie sicher, dass der GC nicht-Einmischung in die Ergebnisse? Kommentarautor: Dariusz
Sie entsandte eine Vielzahl von Daten und Informationen, aber nicht viel, es scheint relevant. Je mehr ich deine Frage Lesen (und gelesen habe ich es mehrmals) desto weniger verstehe ich dein problem. Post code, posten Sie Ihre Messstelle, post-Abschnitt gemessen wird. Andere als das: PROFIL, den CODE und prüfen Sie, was unter, wie viel Zeit. Kommentarautor: Dariusz
Diese Frage hätte ein viel kürzer. Zeigen Sie uns den code in Frage, und teilen Sie weitere Informationen über Ihre benchmarking-Prozess. Es ist wirklich einfach zu tun, sehr schlecht. Kommentarautor: Duncan Jones

InformationsquelleAutor der Frage medv4380 | 2013-02-28

Schreibe einen Kommentar