Seltsame Bytecode-Größe

me-ton

Mitglied
Hi folks,

bitte betrachtet folgende Codefragmente:

A)
Java:
boolean aMethodReturningABoolean() {
    getDoubleA() >= 50 && getDoubleB() >= 0.01;
}

B)
Java:
boolean aMethodReturningABoolean() {
    getDoubleA() > 50 && getDoubleB() > 0.01;
}

Anders als vermutet ist der Bytecode nach dem Kompilieren von B) zwei Byte größer als A).

Woher kommt das?
 

fhoffmann

Top Contributor
Ich wundere mich, dass du dir über solche Fragen Gedanken machst.

Ich habe nicht in die Spezifikation geschaut und habe dazu auch keine Lust. Aber möglicherweise wird "greater or equals" im Bytecode durch "ge" abgekürzt und "greater than" durch "gth" (oder ähnliches). Das würde die Differenz jedenfalls erklären.
 
K

kneitzel

Gast
Erst einmal ist dieser Code nicht übersetzbar, denn Du da zeigst.

Und bei einem Test einer Klasse macht es keinen Unterschied in der Größe:
Java:
public class Test {
  double a, b;

  double getA() { return a; }
  double getB() { return b; }

  public Test(double a, double b) {
    this.a = a;
    this.b = b;
  }

  public boolean test() {
    return getA() >= 50 && getB() >= 0.01;
  }
}

Einmal so und einmal nur mit > übersetzt und beides Mal hat die Test.class die gleiche Größe (510 Bytes bei mir).

Ich wundere mich, dass du dir über solche Fragen Gedanken machst.

Ich habe nicht in die Spezifikation geschaut und habe dazu auch keine Lust. Aber möglicherweise wird "greater or equals" im Bytecode durch "ge" abgekürzt und "greater than" durch "gth" (oder ähnliches). Das würde die Differenz jedenfalls erklären.
In Bytecode dürfte das doch if_cmpge (0xa2) und if_cmpgt (0xa3) sein. Oder habe ich da jetzt etwas durcheinander geworfen?
 
K

kneitzel

Gast
Der Compiler wird wohl so schlau sein und so etwas einfaches wegoptimieren...

Ich lüge nicht falls du das meintest.
Was soll der Compiler Weg optimieren bei meinem Beispiel?

Und niemand sagt, dass du lügst. Nur dass der gezeigte Code nicht compiliert.

Bring etwas, das man nachvollziehen kann, dann kann man sich das im Detail ansehen. So hat man schlicht nichts, das man ansehen könnte.
 

fhoffmann

Top Contributor
In Bytecode dürfte das doch if_cmpge (0xa2) und if_cmpgt (0xa3) sein. Oder habe ich da jetzt etwas durcheinander geworfen?
Die Betonung meines Beitrags sollte darauf liegen, dass ich die Beschäftigung mit solchen Fragen lächerlich finde. Ich intereesier mich nicht dafür, wie mein Java-Code in Byte-Code übersetzt wird. Und noch wenige kümmere ich mich um zwei (in Zahlen: 2) Bytes.
 

Robert Zenz

Top Contributor
Um konkret zu werden, basierend auf dem Beispiel @kneitzel:

Java:
    public boolean testGreater() {
        return getA() > 50 && getB() > 0.01;
    }
    
    public boolean testGreaterThen() {
        return getA() >= 50 && getB() >= 0.01;
    }

Code:
    public boolean testGreater();
        Flags: PUBLIC
        Code:
                  linenumber      10
               0: aload_0         /* this */
               1: invokevirtual   Test.getA:()D
               4: ldc2_w          50.0
               7: dcmpl          
               8: ifle            24
              11: aload_0         /* this */
              12: invokevirtual   Test.getB:()D
              15: ldc2_w          0.01
              18: dcmpl          
              19: ifle            24
              22: iconst_1       
              23: ireturn        
              24: iconst_0       
              25: ireturn        
        StackMapTable: 00 01 18
    
    public boolean testGreaterThen();
        Flags: PUBLIC
        Code:
                  linenumber      14
               0: aload_0         /* this */
               1: invokevirtual   Test.getA:()D
               4: ldc2_w          50.0
               7: dcmpl          
               8: iflt            24
              11: aload_0         /* this */
              12: invokevirtual   Test.getB:()D
              15: ldc2_w          0.01
              18: dcmpl          
              19: iflt            24
              22: iconst_1       
              23: ireturn        
              24: iconst_0       
              25: ireturn        
        StackMapTable: 00 01 18

Und wir sehen, sind ident mit Ausnahme des Vergleichs. Also was auch immer den Unterschied bei dir ausloest, wird sich vermutlich nicht in der Methode finden.

Im Zweifelsfall, schnapp' dir einen Decompiler wie JD oder Luyten, und schaue nach was der Unterschied ist.
 

httpdigest

Top Contributor
Es kommt auf die Version vom Compiler - und vermutlich noch einigen weiteren Heuristiken an. Einige (JDK 18 ea build 16) generieren sowas:
Code:
 0: aload_0
 1: invokevirtual #7                  // Method getA:()D
 4: ldc2_w        #13                 // double 50.0d
 7: dcmpl
 8: iflt          26
11: aload_0
12: invokevirtual #15                 // Method getB:()D
15: ldc2_w        #18                 // double 0.01d
18: dcmpl
19: iflt          26
22: iconst_1
23: goto          27
26: iconst_0
27: ireturn
andere (wie @Robert Zenz zeigte) eben kürzere Sequenzen mit conditional jumps und mehreren returns.
 
K

kneitzel

Gast
Die Betonung meines Beitrags sollte darauf liegen, dass ich die Beschäftigung mit solchen Fragen lächerlich finde.
Da ist die Frage, was das jeweilige Interesse ist. Wenn man ein Auto nur fahren will, dann ist es komplett egal, wie der Motor des Autos genau gesteuert wird und die Software des Computers interessiert einen nicht. Aber dennoch kann es einen interessieren und es muss auch Leute geben, die sich gut damit auskennen - weil die sowas halt bauen.
Und das mit dem Java Bytecode ist durchaus interessant. Bei Java hat mich das so im Detail auch noch nicht interessiert, aber bei .Net habe ich mich sehr intensiv mit MSIL auseinander gesetzt gehabt ...

@Robert Zenz Danke. Und da erkennt man auch gleich einen Fehler - das icmp<op> ist natürlich falsch - es muss das dcmp<op> sein. Und interessamte weise gibt es da als Operatoren nur "g" und "l" und kein "ge" oder "le".
 
K

kneitzel

Gast
Jo, weil ge = !l und le = !g
Ja, das ist die Übersetzung. Nur eben wurde das bei int Werten nicht gemacht:

if_icmp<cond>

Operation​

Branch if int comparison succeeds

Format​


if_icmp<cond>
branchbyte1
branchbyte2

Forms​

if_icmpeq = 159 (0x9f)
if_icmpne = 160 (0xa0)
if_icmplt = 161 (0xa1)
if_icmpge = 162 (0xa2)
if_icmpgt = 163 (0xa3)
if_icmple = 164 (0xa4)

Da ich nun einmal erst über die int Version gestolpert bin, ist mir dies halt aufgefallen.
 

me-ton

Mitglied
Ich konnte anhand des von kneitzel gezeigten Beispiel das Verhalten gerade nicht reproduzieren... In "echt" erstellte ich zusätzlich ein jar file, das weist die unterschiedlichen Größen auf...

Was machst du dann hier in dem Thema? Trollen? Wenn es dich nicht interessiert dann ist doch einfach weggehen die beste Sache, oder etwa nicht?
streitet euch bitte nicht meinetwegen...
 
K

kneitzel

Gast
Kannst du ggf. ein Beispiel aufzeigen? Also ggf ein Projekt mit paar Dateien, an Hand dessen sich das reproduzieren lässt? Denn mich würde das schon interessieren.
 

httpdigest

Top Contributor
Ein jar File nutzt das ZIP Format. Daher ist es komprimiert.
jar bzw. zip heisst nicht automatisch "komprimiert". zip ist ja nur ein Containerformat wie tar, welches optional auch Komprimierung unterstützt. Natürlich nutzen die meisten zip/jar Tools hier eine Compression Ratio != 0 bei zip. Man kann aber auch zip-Dateien wie tar behandeln mit Compression ratio = 0.
Tatsächlich ist es mittlerweile auch üblich, jar Dateien nicht mehr zu komprimieren, um das Laden der Klassen zur Laufzeit zu beschleunigen, gerade wenn Bandbreite keine Rolle mehr spielt.
Siehe auch https://docs.oracle.com/javase/tutorial/deployment/jar/build.html :
You might want to avoid compression, for example, to increase the speed with which a JAR file could be loaded by a browser. Uncompressed JAR files can generally be loaded more quickly than compressed files because the need to decompress the files during loading is eliminated. However, there is a tradeoff in that download time over a network may be longer for larger, uncompressed files.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Seltsame Dateiauslesung Java Basics - Anfänger-Themen 28
J Bug? Seltsame Fehlermeldung Java Basics - Anfänger-Themen 7
A Datums-Differenzen mit LocalDate (Java 8) - Seltsame Differenzwerte Java Basics - Anfänger-Themen 2
A Seltsame Zeichen vor Clienteingabe Java Basics - Anfänger-Themen 5
L buffered reader produziert zu viele und seltsame zeichen Java Basics - Anfänger-Themen 2
T Seltsame Layoutveränderug Java Basics - Anfänger-Themen 6
W Seltsame NullPointerException Java Basics - Anfänger-Themen 8
A Seltsame Class Cast Exception Java Basics - Anfänger-Themen 3
F Seltsame Zeichen und kein Zeichenumbruch mit Filewriter Java Basics - Anfänger-Themen 4
T Seltsame Runtime-Fehlermeldung Java Basics - Anfänger-Themen 4
T RandomAccessFile erzeugt seltsame Zeichen Java Basics - Anfänger-Themen 2
C seltsame schleife Java Basics - Anfänger-Themen 6
berserkerdq2 Ist JVM das gleiche wie IJVM (Bytecode) Java Basics - Anfänger-Themen 1
@ Umgebungsvariable Bytecode per CMD interpretieren => unverständlicher Fehler Java Basics - Anfänger-Themen 2
O Java will mir den Quelltext nich zu Bytecode Compilieren Java Basics - Anfänger-Themen 24
S Bytecode sichtbar machen Java Basics - Anfänger-Themen 2
-horn- Java-Bytecode und Outputs verschlüsseln? Java Basics - Anfänger-Themen 3
E I-JVM verstehe ich das richtig (bytecode aufgabe) Java Basics - Anfänger-Themen 2
A Ablauf von Bytecode Transformation Java Basics - Anfänger-Themen 10
W Java Bytecode Java Basics - Anfänger-Themen 3
B Fragen zu threads, swing, und dem bytecode compiler, etc. Java Basics - Anfänger-Themen 4
O File2String /Bytecode auslesen Java Basics - Anfänger-Themen 2
M Bytecode ansehen Java Basics - Anfänger-Themen 2
T sortierung der eingabe nach größe Java Basics - Anfänger-Themen 5
S Java Client-je nach Heap Size Größe startet Applikation oder nicht Java Basics - Anfänger-Themen 4
J Größe eines Strings in Pixel Java Basics - Anfänger-Themen 18
C initialisieren eines arrays richtiger Größe und mit geeignetem Datentyp Java Basics - Anfänger-Themen 26
J JScrollePane größe anpassen Java Basics - Anfänger-Themen 4
G Bubblesort Array der Größe 10 Java Basics - Anfänger-Themen 1
Kawastori Größe eines Arrays bestimmen Java Basics - Anfänger-Themen 13
D Probleme mit JFrame und der Größe Java Basics - Anfänger-Themen 8
O ADT Graph nach größe Abfragen Java Basics - Anfänger-Themen 42
G Benutzereingaben durch Zeilenumbruch trennen und in Array individueller Größe speichern Java Basics - Anfänger-Themen 20
T JLabel hat falsche größe Java Basics - Anfänger-Themen 1
H Swing Button hat falsche Größe Java Basics - Anfänger-Themen 5
D JPanel passt die Größe nicht an Java Basics - Anfänger-Themen 22
E Array-Größe anpassen Java Basics - Anfänger-Themen 1
Z ArrayList direkt feste Größe mitgeben Java Basics - Anfänger-Themen 13
R Verschachtelte Arraylist und deren Größe auslesen Java Basics - Anfänger-Themen 7
D Größe der Zahlenkombinationen eines Arrays begrenzen Java Basics - Anfänger-Themen 0
V Die die aktuelle Größe zusätzlich in einem Label angezeigt wird Java Basics - Anfänger-Themen 11
J Liste der Größe nach sortieren Java Basics - Anfänger-Themen 2
P Größe der BufferStrategy in der Window-Klasse Java Basics - Anfänger-Themen 5
S String nach Größe sortieren Java Basics - Anfänger-Themen 6
O Größe von Objekten Java Basics - Anfänger-Themen 5
H Erste Schritte Größe eines 2 dimensionalen Arrays ausgeben Java Basics - Anfänger-Themen 6
M Feste Größe des JFrames - Problem mit Dimension Java Basics - Anfänger-Themen 6
S 2D-Spiel im Vollbild an größe anpassen? Java Basics - Anfänger-Themen 3
1 Größe einer zirkulären Liste bestimmen .. ? Java Basics - Anfänger-Themen 2
S JSlider Schritt Größe Java Basics - Anfänger-Themen 5
D Ausgabefenster größe festlegen Java Basics - Anfänger-Themen 3
P JTabel größe ändern und button anzeigen Java Basics - Anfänger-Themen 5
M Größe eines Buttons festlegen Java Basics - Anfänger-Themen 4
L JLabel Icon Größe anpassen Java Basics - Anfänger-Themen 11
S Datentypen und ihre Größe Java Basics - Anfänger-Themen 21
P JFrame Component automatische Größe verhindern Java Basics - Anfänger-Themen 2
L 3 Zahlen einlesen und nach der Größe Sortieren Java Basics - Anfänger-Themen 5
A Bildgröße automatisch auf JLabel Größe konvertieren Java Basics - Anfänger-Themen 9
W Methoden größe zweier tiere vergleichen Java Basics - Anfänger-Themen 15
B JTabbedPane größe der Tabs ändern Java Basics - Anfänger-Themen 6
M Größe einer Datei via. Link ermitteln Java Basics - Anfänger-Themen 9
T Erste Schritte Textfeld übernimmt Größe nicht Java Basics - Anfänger-Themen 11
W JButton in gleiche Größe bringen Java Basics - Anfänger-Themen 4
A Größe von Bild festlegen Java Basics - Anfänger-Themen 3
E Buchstaben nach Größe vergleichen Java Basics - Anfänger-Themen 4
M OOP Methode überschreiben mit String-Paramter unterschiedlicher Größe? Java Basics - Anfänger-Themen 19
RySa Input/Output aktuelle größe des BufferedWriters ? Java Basics - Anfänger-Themen 5
T ArrayIndexOutOfBoundsException - Problem mit Array-Größe Java Basics - Anfänger-Themen 4
L Größe von Ordner wiedergeben Java Basics - Anfänger-Themen 4
J Array Größe über Kommandozeile eingeben Java Basics - Anfänger-Themen 3
K GUI - Größe nicht änderbar Java Basics - Anfänger-Themen 7
B Tabelle, Größe der Komponenten Java Basics - Anfänger-Themen 2
Luk10 Größe von Objekten Java Basics - Anfänger-Themen 4
A Datentypen Größe eines mehrdimensionales Arrays Java Basics - Anfänger-Themen 4
E Titel und Größe vom JFrame setzen Java Basics - Anfänger-Themen 6
A Bild ändert Größe des Gridbag Layouts Java Basics - Anfänger-Themen 4
M Größe einer Konsole ermitteln Java Basics - Anfänger-Themen 2
D Zylinder/Eigenschaften (auf Größe) vergleichen Java Basics - Anfänger-Themen 16
c_sidi90 Größe von Dateien aus File Array ermitteln Java Basics - Anfänger-Themen 12
N zweidimensionales array größe bestimmen Java Basics - Anfänger-Themen 1
I Schriftart / farbe / größe bei Emailversand ändern Java Basics - Anfänger-Themen 17
K Problem mit Applet Größe Java Basics - Anfänger-Themen 5
Luk10 Größe eines Arrays ausgeben Java Basics - Anfänger-Themen 4
B JButton Größe einstellen? Java Basics - Anfänger-Themen 3
T Wie kann ich einem Graph in nem JPanel eine fixe Größe geben? Java Basics - Anfänger-Themen 6
MisterSeven Java Swing - Wie Frame größe festlegen?! Java Basics - Anfänger-Themen 10
M größe JEditorPane Java Basics - Anfänger-Themen 5
radiac Von einem Bild die Größe rausfinden??? Java Basics - Anfänger-Themen 9
J 2Dimensionales Array, Größe durch Eingabe bestimmen Java Basics - Anfänger-Themen 9
S Eclipse Java Applet größe ändern aber wie? Java Basics - Anfänger-Themen 5
M array - größe Java Basics - Anfänger-Themen 8
Z TextArea Größe festlegen Java Basics - Anfänger-Themen 22
K Größe, mehrdimensionales Array Java Basics - Anfänger-Themen 6
B ComboBox Größe ändern Java Basics - Anfänger-Themen 4
P Größe eines JButton? Java Basics - Anfänger-Themen 17
C die Klasse File - die größe der Datei anzeigen Java Basics - Anfänger-Themen 12
Q Vector verändert trotz final seine Größe Java Basics - Anfänger-Themen 5
-horn- Array mit nicht fixer Größe möglich? Nachträgliches befüllen Java Basics - Anfänger-Themen 10
C Größe einer Referenz ? Java Basics - Anfänger-Themen 16
G JButton LookAndFeel - Größe ändern Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben