Klammern im Bytecode

Status
Nicht offen für weitere Antworten.

Reality

Top Contributor
Hi,
wenn man bei if-Abfragen oder bei while-Schleifen nur eine Anweisung schreibt, dann muss man keine Klammern schreiben.

Gibt es im Byte-Code einen Unterschied, wenn ich

Code:
if(bla)
  do bla

schreibe, anstatt

Code:
if(bla){
  do bla
}

?
Bei langen Schleifen mit einer if-Abfrage kann man ohne Klammern vielleicht etwas an Perfomance gewinnen. ;)

Liebe Grüße
Reality
 

zerko

Aktives Mitglied
Meine Erfahrungen sprechen, eigentlich nicht dafür, dass durch dein angesprochenes Thema "bessere Performace" entsteht...

Ich würde eher sagen, dass ein Quellcode dieser Form...
Code:
if ( iTest = 10 ){
    //Irgendwas

    if (  ) {
        //Irgendwas Anderes
    }
}

Dieser Code für mich besser lesbar ist und "mit einer guten Formatierung gedacht wurde"..
Ich hasse besonders IF-ELSE-Abfragen dieser Form..
Code:
if ( iTest = 10 ) retrun true : return false;        //Kenne die genau Schreibweise net...


Gruß
zerko
 

0xdeadbeef

Top Contributor
Wäre der berühmt ?:-Operator:

Code:
return ( iTest == 10 ) ? true : false;

Nebenbei bemerkt können sich geschweifte Klammern IMHO kaum im Bytecode niederschlagen.
 

bummerland

Top Contributor
0xdeadbeef hat gesagt.:
Wäre der berühmt ?:-Operator:

Code:
return ( iTest == 10 ) ? true : false;

Nebenbei bemerkt können sich geschweifte Klammern IMHO kaum im Bytecode niederschlagen.

dafür kannst auch gleich
Code:
return iTest == 10;
schreiben.
 

Sky

Top Contributor
Reality hat gesagt.:
Bei langen Schleifen mit einer if-Abfrage kann man ohne Klammern vielleicht etwas an Perfomance gewinnen. ;)

Guck Dir da mal lieber die langen Schleifen und die if-Abfragen an. Da kann man meist mehr sparen als bei irgendwelchen Klammern :) Manchmal geht es auch mit weniger Schleifendurchläufen oder mit einfacheren if-Anweisungen :)

Wenn Du ein konkretes Problem hast, einfach mal zeigen, ich gucke mir sowas gerne mal an :)
 

Reality

Top Contributor
Hi sky,
habe eigentlich keine Probleme mit den Schleifendurchgängen und If-Abfragen. War nur ein Gedanke ob derselbe Bytecode verwendet wird und ob das etwas an Perfomance bringt (also messbare Ergebnisse, auch wenn sie klein sind), wenn man die Klammern weglässt; rein vom Prinzip her.

Liebe Grüße
Reality
 

0xdeadbeef

Top Contributor
Ich gehe zu 99.7% davon aus, daß die Klammern nur den Parser interessieren und der Compiler den genau gleichen Code mit und ohne Klammern erzeugt. Kannst Dir ja den Bytecode angucken oder eine Messung machen.
 

meez

Top Contributor
0xdeadbeef hat gesagt.:
Ich gehe zu 99.7% davon aus, daß die Klammern nur den Parser interessieren und der Compiler den genau gleichen Code mit und ohne Klammern erzeugt. Kannst Dir ja den Bytecode angucken oder eine Messung machen.

Dito und gleiches für ?:...
 

Sky

Top Contributor
Ich bin davon überzeugt, dass der Bytecode nicht der gleiche bzw. der selbe :) ist.

ABER wie oben schon gesagt: Es macht performance-mässig bestimmt nichts aus, ob mit oder ohne Klammer.
 
B

Beni

Gast
Ob mit oder ohne Klammer macht keinen Unterschied. Man muss den Bytecode halt betrachten, und nicht nur Vermutungen aufstellen :wink:

Der ?:-Operator wurde anders übersetzt, aber das ist klar, es ist ja auch nicht 100% derselbe Code.

Javacode
Code:
public class Test{
	private boolean a = false;

	public void testA(){
		String s;

		if( a ){
			s = "hallo";
		}
		else{
			s = "tschau";
		}

		System.out.println( s );
	}

	public void testB(){
		String s;

		if( a )
			s = "hallo";
		
		else
			s = "tschau";
		

		System.out.println( s );
	}

	public void testC(){
		String s;

		s = a ? "hallo" : "tschau";

		System.out.println( s );
	}
}

Bytecode
Code:
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   aload_0
   5:   iconst_0
   6:   putfield        #2; //Field a:Z
   9:   return

public void testA();
  Code:
   0:   aload_0
   1:   getfield        #2; //Field a:Z
   4:   ifeq    13
   7:   ldc     #3; //String hallo
   9:   astore_1
   10:  goto    16
   13:  ldc     #4; //String tschau
   15:  astore_1
   16:  getstatic       #5; //Field java/lang/System.out:Ljava/io/PrintStream;
   19:  aload_1
   20:  invokevirtual   #6; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   23:  return

public void testB();
  Code:
   0:   aload_0
   1:   getfield        #2; //Field a:Z
   4:   ifeq    13
   7:   ldc     #3; //String hallo
   9:   astore_1
   10:  goto    16
   13:  ldc     #4; //String tschau
   15:  astore_1
   16:  getstatic       #5; //Field java/lang/System.out:Ljava/io/PrintStream;
   19:  aload_1
   20:  invokevirtual   #6; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   23:  return

public void testC();
  Code:
   0:   aload_0
   1:   getfield        #2; //Field a:Z
   4:   ifeq    12
   7:   ldc     #3; //String hallo
   9:   goto    14
   12:  ldc     #4; //String tschau
   14:  astore_1
   15:  getstatic       #5; //Field java/lang/System.out:Ljava/io/PrintStream;
   18:  aload_1
   19:  invokevirtual   #6; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   22:  return

}
 

Illuvatar

Top Contributor
Bei C sieht zwar der Bytecode anders aus, aber da is nur goto woanders, d.h. ausgeführt wird zu 100% dasselbe.

-->Klammern sind egal, ?: spart Festplattenplatz ist aber auch gleichschnell ;)
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben