unnecessary cast & Performance

Status
Nicht offen für weitere Antworten.
Y

youssef

Gast
Hallo Zusammen,
ich habe in einer Applikation, die ich verwende viele Unnecessary cast Warnungen . ich arbeite mit eclipse 3.2.
ein Beispiel:


Code:
public class A
{
}

public class B
{
.....
private static  A a

public static A f(double d)
{
.....
return(A)a;//unnecessary cast
}

}

public class C
{
......
int i=5;
A a = B.f((double)i);//unnecessary cast
}
ich habe gelesesen dass diese unnecessary cast at run time zeit kosten.
machen diese unnecessary cast wirklich die Performance schlechter ? habt ihr quellen dazu ?

danke im voraus
Youssef
 

SnooP

Top Contributor
ich dachte eigentlich, dass die der Compiler rausfischen kann, denn immerhin erkennt sie ja auch eclipse durch eine entsprechende Analyse... - von daher glaub ich fast gar nicht, dass das Performance schlechter macht... - abgesehen davon wäre das sicherlich minimal und kaum messbar...

aaaber... warum hast du die überhaupt drin? Imho machen diese Casts das ganze nicht lesbarer...
 

AlArenal

Top Contributor
Nein, das kann der Compiler nicht immer rausfischen. Du kannst doch zur Laufzeit beliebige Object Instanzen in eine Collection schieben, auslesen und casten. Wäre das allein durch den Compiler immer eindeutig, gäbe es keine ClassCastException zur Laufzeit. Erst mit Generics (Java 5) hat man eien Möglichkeit zur Compile-Time Typsicherheit für typisierten Kram zu prüfen und zu gewährleisten.
 

byte

Top Contributor
Naja, aber Unnecessary Casts sind halt nur diejenigen, die wirklich unnötig sind. Und ich denke auch, dass der Compiler die eh wegoptimiert.
 

AlArenal

Top Contributor
Einigen wir uns darauf, dass es keinen Sinn macht eine Referenz in ihren eigenen Typ zu casten und sich daraus ergibt, dass man sich auch keine Gedanken machen muss, obs Performance kostet oder nicht ;)

Das ist wie:
Frage: In Brasilien ist dem Benzin Ethanol beigemischt. Wirkt sich das auf die Leistung meines Wagens aus?
Antwort: Nein, denn du tankst in Deutschland.

Also Youssef, tanke in Deutschland, dann brauchste dir auch keinen Kopf um Motorleistung in Brasilien machen ;)
 
Y

youssef

Gast
danke an alle für eure antworten

@AlArenal
diese cast Operationen kommen nicht von mir (ich habe sie nicht eingebaut), sondern waren schon drin in der Applikation, die ich weiterpflegen muss.
Eclipse zeigt wegen der Compiler Setting Warnungen in diesen Stellen.
ich habe mir nur gefragt ob es Sin macht (den Aufwand wert ) diese Casting raus zunehmen oder nicht:
Performance, Lesbarkeit und ...


Youssef
 

AlArenal

Top Contributor
Ich kann mir ehrlich gesagt nicht vorstellen, dass diese Casts Performance kosten. Allerdings habe ich auch keine Lust mir nun schwre Kost anzutun und mich in die Umsetzung der VM einzulesen. Wenn einer Bock hat, kann er ja mal Beispielcode mit und ohne überflüssigen Cast machen, kompilieren und den Bytecode vergleichen.

Das würde aber auch nru klären, obs Platz kostet. Da die aktuellen VMs alle on-the-fly das Programm untersuchen und auf die jeweilige Plattform hin optimieren, sagt das allein noch nichts über Performance Penaltys aus.
 

SnooP

Top Contributor
Gibt es da kein fertiges Refactoring für? Weil wenn Eclipse schon Warnings dafür ausspucken kann, dann könnte man die ja gleich entfernen lassen... in dem Fall ist das ja wirklich nur nen einfaches replace.

zur performance... - muss nicht die Methode selbst intern sowas wie nen cast machen? Also quasi implizit, während dieser cast bei einem explizitem Cast beim Aufrufen der Methode ja entfällt... ergo sollte ziemlich genau die gleiche Sache rauskommen...
 

byte

Top Contributor
Seit Eclipse 3.2 Project -> Source -> Clean Up -> Unnecessary Code -> Remove unnecessary casts
 

Leroy42

Top Contributor
AlArenal hat gesagt.:
Allerdings habe ich auch keine Lust mir nun schwre Kost anzutun und mich in die Umsetzung der VM einzulesen. Wenn einer Bock hat, kann er ja mal Beispielcode mit und ohne überflüssigen Cast machen, kompilieren und den Bytecode vergleichen.

Zu beidem habe ich auch keine Lust, aber ich denke -- ungeprüft -- das man
hierbei mit gesundem Vorstellungsvermögen zu einer Lösung kommt.

AlArenal hat gesagt.:
Du kannst doch zur Laufzeit beliebige Object Instanzen in eine Collection schieben, auslesen und casten.

Genau das bezweifle ich stark. Soweit ich mich in die JVM hineinversetzen kann,
gibt es überhaupt keinen Code zum casten. Der Cast dürfte ausschließlich
eine Angelegenheit zur Compile-Zeit für den Compiler sein, dem damit versprochen wird
auf Methoden/Instanzvariablen der entsprechenden Klassendefinition zur Laufzeit zugreifen zu dürfen.
Nach dem Kompilieren dürfte keine Spur mehr von diesem Cast zu finden sein.


AlArenal hat gesagt.:
Wäre das allein durch den Compiler immer eindeutig, gäbe es keine ClassCastException zur Laufzeit.
Auch hier ist meine Meinung, daß die ClassCastExceptions nicht beim casten selbst,
der ja nach meinen obigen Ausführungen zur Laufzeit gar nicht existiert, geworfen wird,
sondern direkt durch die Zugriffe auf nicht-vorhandene Methoden/Instanzvariablen.
 

Wildcard

Top Contributor
Beispiel:
Code:
public class Casts
{
    public static void main(String[] args)
    {
        Object o = "";
        print(o);
        print((String)o);
    }
    
    public static void print(Object o)
    {
        System.out.println("Objekt");
    }
    
    public static void print(String s)
    {
        System.out.println("String");
    }
}
 
S

SlaterB

Gast
ist das nicht eher eine Unterscheidung nach Typ des Objektes?
dabei müssen ja nicht unbedingt Casts zum Einsatz kommen

(unwissend in den Wind gesprochen)

edit: na dieses Beispiel ist ja extrem unpassend,
da wird doch evtl. nur zur Kompilierzeit die eine oder andere Operation ausgewählt?

mag sein dass es am cast liegt,
aber das beweist das Programm nicht,
das könnte auch der Kompiler gewesen sein
 

Wildcard

Top Contributor
Wie du siehst hat der Cast hier einen Einfluss, was bedeutet das er auch zur Laufzeit ausgeführt wird, da das Objekt ja immer noch das selbe ist.
 

Leroy42

Top Contributor
Wildcard hat gesagt.:
Wie du an Methodenüberladung erkennen kannst spielen casts zur Laufzeit eine Rolle.

Auch das wird zur Laufzeit erkannt

Code:
void x(int i);
void x(long l);
unterscheidet sich ja alleine schon durch die Methodenadressen
innerhalb einer Klasse.

Wenn du auf Vererbung anspielst, dann wird dies durch die
virtuelle Tabelle der Methodenzeiger erledigt.

((A) myBInstance).doSomething();
myBInstance.doSomething();

rufen dieselbe Methode auf (nämlich die von B) falls
B von A erbt und doSomething() überschreibt.
Der Cast hierbei ist für die Katz'.
 
S

SlaterB

Gast
@Wildcard

na dieses Beispiel ist ja extrem unpassend,
da wird doch evtl. nur zur Kompilierzeit die eine oder andere Operation ausgewählt?

mag sein dass es am cast liegt,
aber das beweist das Programm nicht,
das könnte auch der Kompiler gewesen sein
 
S

SlaterB

Gast
what the hell ist a Reflection-Cast, falls an mich gerichtet
 

Leroy42

Top Contributor
Wildcard hat gesagt.:
was bedeutet das er auch zur Laufzeit ausgeführt wird, da das Objekt ja immer noch das selbe ist.
Das Objekt ist dasselbe aber der Compiler konnte schon zur Laufzeit die Methode
festlegen die aufgerufen wird.

Wildcard hat gesagt.:
Und wie erklärst du das bei Reflection-Casts?

Das gibt es auch nur zur Compile-Zeit, da es zur Laufzeit sowieso nur
Objekte vom Typ Object gibt.
 
R

Roar

Gast
leroy hat teilweise recht, die methoden die aufgerufen werden, werden zur compile zeit festgelegt, aber darin, dass der "cast" auch im bytecode vermerkt wird, sind wir uns ja einig, sonst würde keine classcast exception fleigen.
 

Wildcard

Top Contributor
Code:
public class Casts
{
    public static void main(String[] args)
    {
        
        Object o = "";
        print(o);
        print(String.class.cast(o));
    }
    
    public static void print(Object o)
    {
        System.out.println("Objekt");
    }
    
    public static void print(String s)
    {
        System.out.println("String");
    }
}
Ich glaube nicht das ein solches Konstrukt Compilermagic ist.
 
R

Roar

Gast
Wildcard: schau dir mal die methode cast() an, die arbeitet mit generics, die zur compilezeit aufgelöst werden. der resultierende bytecode ist also im prinzip identisch mit dem von print((String) o) (abgesehen von Class objekt laden unc cast() aurufen):

Code:
        Object o = "";
        print(o);
		print((String) o); 
		print(String.class.cast(o));

Code:
   0:   ldc     #2; //String
   2:   astore_1
   3:   aload_1
   4:   invokestatic    #3; //Method print:(Ljava/lang/Object;)V
   7:   aload_1
   8:   checkcast       #4; //class java/lang/String
   11:  invokestatic    #5; //Method print:(Ljava/lang/String;)V
   14:  ldc_w   #4; //class java/lang/String
   17:  aload_1
   18:  invokevirtual   #6; //Method java/lang/Class.cast:(Ljava/lang/Object;)Lj
ava/lang/Object;
   21:  checkcast       #4; //class java/lang/String
   24:  invokestatic    #5; //Method print:(Ljava/lang/String;)V
 

Leroy42

Top Contributor
Roar hat gesagt.:
leroy hat teilweise recht, die methoden die aufgerufen werden, werden zur compile zeit festgelegt, aber darin, dass der "cast" auch im bytecode vermerkt wird, sind wir uns ja einig, sonst würde keine classcast exception fleigen.

Hab's mal getestet und bin jetzt überzeugt.
Code:
public class Test extends Frame {
	public static void main(String args[]) {
		Object o =  new Integer(42);
		String s = (String) o;
		System.out.println("Hallo");
		s.indexOf('Z');
	 }
 }

liefert zur Laufzeit eine ClassCastException in Zeile 4; nicht erst
in Zeile 6 wie ich erwartet hätte.

Trotzdem ist mir jetzt nicht klar, wie die JVM überhaupt die
ClassCastException erkennt. Meines bisherigen Wissens nach,
kennt Java den Typ zur Laufzeit doch nicht.

Bin im Moment total durcheinander! :autsch: ???:L
 

Wildcard

Top Contributor
Jau, ich seh's gerade. Dachte eigentlich die Methode gab's schon vor Java5... :)
Klärt trotzdem nicht die Frage ob der Compiler casts durch geschicktes linken auflöst oder 'cast' zur Laufzeit exisitieren.
Bleiben wohl nur die specs.
 
R

Roar

Gast
Leroy: jedes Object in der VM kennt doch sein Class Objekt, also auch seinen Typ, damit sollte das dann ja kein Problem mehr sein den cast zu überprüfen :)

ahja: "
liefert zur Laufzeit eine ClassCastException in Zeile 4; nicht erst
in Zeile 6 wie ich erwartet hätte. " also da der cast in zeile 4 durchgeführt wird - jedenfalls in meinem code - erwarte ich auch dass die vm dort mir meine excfeption wirft, ansonstern viel spaß beim fehler suchen :bae:

Wildcard: Generics werden eigentlich alle zur compile zeit geprüft und aufgelöst, wie man am bytecode auch erkennen kann :)
 
S

SlaterB

Gast
auch Eclipse kann das,
wenn man da jeweils 'Open Declaration' aufruft kommt man zur einen oder anderen Operation
 

byte

Top Contributor
Leroy42 hat gesagt.:
Trotzdem ist mir jetzt nicht klar, wie die JVM überhaupt die
ClassCastException erkennt. Meines bisherigen Wissens nach,
kennt Java den Typ zur Laufzeit doch nicht.

Heureka, wie kommst Du denn auf sowas? Ausschließlich generische Typinformationen sind zur Laufzeit nicht mehr verfügbar.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zeppi Cast Object in Generics Allgemeine Java-Themen 4
Tarrew RMI Java RMI - com.sun.proxy.$Proxy1 cannot be cast to Funktionen Allgemeine Java-Themen 0
G Klassen Cast auf Argumentenklasse via Reflection? Allgemeine Java-Themen 10
M Cast double[]-->Object[] oder Vector<double[]> Allgemeine Java-Themen 3
M Harten Cast vermeiden Allgemeine Java-Themen 7
S Unchecked cast from Component to JComboBox<String> Allgemeine Java-Themen 3
P Reflection "Cast" Allgemeine Java-Themen 5
M cannot be cast to java.lang.Comparable Allgemeine Java-Themen 5
V Gibt es einen Variablen Cast? Allgemeine Java-Themen 8
Z Cast von Long zu Integer funktionert nicht Allgemeine Java-Themen 3
N cast über string Allgemeine Java-Themen 24
C int zu byte cast - verständnis Allgemeine Java-Themen 3
E Heap und Comparable (warning: [unchecked] unchecked cast) Allgemeine Java-Themen 2
MQue cast DefaultMutableTreeNode Allgemeine Java-Themen 2
M Type-Cast Allgemeine Java-Themen 3
G Cast Allgemeine Java-Themen 4
O unchecked cast? Allgemeine Java-Themen 4
S instanceof liefert true, aber cast funktioniert nicht! Allgemeine Java-Themen 6
reibi Unchecked cast Allgemeine Java-Themen 1
T cast Object to Double[] Allgemeine Java-Themen 2
G Trotz Generics Cast-Fehler! Allgemeine Java-Themen 5
G Object cast via Reflection Allgemeine Java-Themen 8
R cast Integer[] zu int[] Allgemeine Java-Themen 2
G Cast von String zu Enumeration Allgemeine Java-Themen 2
N Warning "The Cast from Object to" Allgemeine Java-Themen 9
D Cast schlägt fehl : Object[] zu Button[] Allgemeine Java-Themen 2
B unchecked cast Error Allgemeine Java-Themen 2
K Cast ohne neues Object zu erzeugen Allgemeine Java-Themen 12
D Cast Exeption Allgemeine Java-Themen 4
T JNI: jcharArray: warning: cast to pointer from integer of. Allgemeine Java-Themen 5
K Cast von Properties und Hashmap Allgemeine Java-Themen 9
E NumberFormatException bei cast auf double Allgemeine Java-Themen 5
H [unchecked] unchecked cast Problem Allgemeine Java-Themen 5
8u3631984 Frage Performance bei Linked List und Array List Allgemeine Java-Themen 5
H Performance einer Monte-Carlo-Simulation verbessern Allgemeine Java-Themen 6
goldmensch Datentypen Welche Methode hat die bessere Performance? Allgemeine Java-Themen 12
H Watson-Crick-Complement Performance Allgemeine Java-Themen 18
L Best Practice Auslagerung von Code = Performance Optimierung? Allgemeine Java-Themen 4
B Performance Messungen Allgemeine Java-Themen 4
J Threads verbessern die Performance NICHT ? Allgemeine Java-Themen 8
X Performance für Tomcat / Apache optimieren Allgemeine Java-Themen 2
I Performance - JDBC UPC PoolDataSoure Allgemeine Java-Themen 0
E Lambda filter performance Allgemeine Java-Themen 2
D Performance-Probleme mit Joda-Time Allgemeine Java-Themen 3
A Jasper Report Performance bei PDF erzeugen Allgemeine Java-Themen 0
A Best Practice Variablen vertauschen - Performance Allgemeine Java-Themen 1
R DBUnit Performance Probleme Allgemeine Java-Themen 0
P Performance: super explizit erwähnen oder weglassen? Allgemeine Java-Themen 5
S starke performance probleme des forums Allgemeine Java-Themen 10
C Performance Tips Allgemeine Java-Themen 13
A Performance/Speicherplatz-Nutzung bei Tests Allgemeine Java-Themen 6
R Java Performance testen Allgemeine Java-Themen 18
StrikeTom Java Performance Fragen Allgemeine Java-Themen 5
V Performance steigern Allgemeine Java-Themen 7
D Reflection-Performance Allgemeine Java-Themen 7
M Einfluss von Caching auf die Performance (große Arrays) Allgemeine Java-Themen 24
R Collections Performance einer HashMap Allgemeine Java-Themen 26
i<3java [Groovy/Grails](oder auch java) Mögliche Performance Probleme bei Mailversendung Allgemeine Java-Themen 2
D Performance Objektallokation Allgemeine Java-Themen 28
J Java Performance nicht nachvollziehbar Allgemeine Java-Themen 3
I Library für High Performance Mime Type Erkennung Allgemeine Java-Themen 8
S Performance Frage: Objekt oder static? Allgemeine Java-Themen 33
M Runtime.exec() - Performance / Frage zu Threads Allgemeine Java-Themen 5
M Performance Allgemeine Java-Themen 6
M Performance Allgemeine Java-Themen 5
E Performance website download Allgemeine Java-Themen 13
MQue Performance Methodenaufruf - if Abfrage Allgemeine Java-Themen 19
hdi Was frisst in meinem Programm den Speicher / verschlechtert die Performance Allgemeine Java-Themen 11
J Performance von Java GUI-Anwendungen Allgemeine Java-Themen 2
U Java Performance im Vergleich zu C++ in speziellem Anwendungsfall Allgemeine Java-Themen 6
S Performance und Function Call Depth Allgemeine Java-Themen 6
H Performance Vorteil durch Wechsel der JVM? Allgemeine Java-Themen 6
A Performance: byte[] in byte[][][] konvertieren Allgemeine Java-Themen 2
T Performance ArrayList#remove Allgemeine Java-Themen 8
ARadauer Performance Pptimierung -Lesen/Schreiben Allgemeine Java-Themen 10
Chris81T Performance Problem durch mehrfaches Starten eines JAVA Prog Allgemeine Java-Themen 8
G Hibernate, JTable und Performance Allgemeine Java-Themen 17
M Listener und Performance Allgemeine Java-Themen 9
P Performance: Ziehen ohne Zurücklegen (große Datenmenge) Allgemeine Java-Themen 10
D Performance: ArrayList vs. Array vs. "Eigene Liste&quot Allgemeine Java-Themen 8
M nichtreferenzierte Objekte auf NULL setzen -> Performance Allgemeine Java-Themen 4
S Ursache für schlechte Performance Allgemeine Java-Themen 2
L Java Performance Check Tool Allgemeine Java-Themen 3
S Performance von Comparator Allgemeine Java-Themen 3
egrath Performance Problem mit File-I/O Allgemeine Java-Themen 6
S Performance Problem Allgemeine Java-Themen 11
X Java Performance auf Sun Systemen bzw. generell Allgemeine Java-Themen 4
T Performance String-Operationen und StringBuffer (1.4und 1.5) Allgemeine Java-Themen 18
P miese performance bei nem BufferedImage + repaint :( Allgemeine Java-Themen 6
T Performance-Grundlagen Allgemeine Java-Themen 4
G Performance Problem bei der Übertragung Server zum Client Allgemeine Java-Themen 3
V Performance Leck finden Allgemeine Java-Themen 3
T Tile Game Performance Allgemeine Java-Themen 32
M Performance enorm langsam Allgemeine Java-Themen 26
F Performance von Reflection vs Statisches Coden Allgemeine Java-Themen 4
M Performance: Java zu C/C++ bei Datenbankanwendung Allgemeine Java-Themen 3
conan2 Performance von paint() Allgemeine Java-Themen 2
G Performance JDOM - DOM - eigene HashMap (SAX) Allgemeine Java-Themen 2
F Bilder als "Thumbnails" laden - Performance Allgemeine Java-Themen 6
S Java3D Performance optimieren Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben