Gibt es eine Laufzeit Kosten für Casting in Java?
Würde es sich performance-Unterschiede zwischen diesen beiden Blöcken?
public void doSomething(Supertype input)
{
Subtype foo = (Subtype)input;
foo.methodA();
foo.methodB();
}
vs.
public void doSomething(Supertype input)
{
((Subtype)input).methodA();
((Subtype)input).methodB();
}
Anderen überlegungen oder Empfehlungen zwischen diesen beiden?
- In der Realität dieser situation würden Sie nur erklären, sondern auch das argument zu sein
Subtype
, aber das macht Sinn, zum Beispiel Zwecke 🙂 - Ja.. davon aus, dass es mehr in diese Methode, die gewährleistet, dass wir die Arbeit mit dem Subtyp durch diesen Punkt. 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, die kompilierten code enthält diese wahrscheinlich die Besetzung zweimal im zweiten Fall - so in der Theorie es ist die gleiche Arbeit zweimal. Aber, es ist sehr möglich, dass ein smart JIT wird, machst du den gleichen Zauber auf den gleichen Wert, so kann es die cache-Ergebnis. Aber es ist zur Arbeit mindestens einmal, nachdem alle, es muss eine Entscheidung, ob der cast um erfolgreich zu sein, oder werfen eine Ausnahme.
Als je zuvor, sollten Sie den test und profile deinen code, wenn Sie sich sorgen über die performance, aber ich würde persönlich benutze die erste form sowieso, nur weil es sieht mehr lesbar für mich.
DirectCast
in Vb für Formen, die nicht erforderlich ist, jede form der Umwandlung). Oder ist der beste Fall wirklich den cast einmal und speichern Sie es in einigen Variablen (vorausgesetzt, die Lesbarkeit ist etwas besser, für den Fall das mehrere casts in meinem Fall).Ja. Prüft, getan werden muss, mit jeder Besetzung zusammen mit den eigentlichen Mechanismus des Castings, also casting mehrmals wird mehr Kosten als casting einmal. Aber das ist die Art von Sache, die würde der compiler wahrscheinlich optimieren Sie Weg. Es kann deutlich sehen, dass der Eingang hat sich nicht geändert, seine Art, die seit dem letzten cast und sollte in der Lage sein, um zu vermeiden, mehrere wirft - oder zumindest vermeiden, dass einige der casting-Prüfungen.
In jedem Fall, wenn Sie wirklich , dass besorgt über den Wirkungsgrad, würde ich Fragen, ob Java ist die Sprache, die Sie verwenden sollten.
Persönlich, ich würde sagen, zuerst verwenden. Es ist nicht nur besser lesbar, aber es macht es einfacher, um den Typ zu ändern später. Sie müssen nur ändern Sie es in einem Ort, anstatt jedes mal, wenn Sie rufen Sie eine Funktion auf diese variable.
Ich Stimme mit Jon ' s Kommentar, tun Sie es einmal, aber für was es Wert ist, in die Allgemeine Frage der "casting-teuer", von was ich mich erinnere: Java 1.4 verbesserte diese deutlich mit Java-5-casts extrem preiswert. Es sei denn, Sie schreiben eine game-engine, ich weiß nicht, ob es etwas zu ärgern über nicht mehr. Ich würde keine sorgen mehr um auto-boxing/unboxing und hidden Objekt-Erstellung statt.
Acording dieser Artikel, es ist mit Kosten verbunden casting.
Bitte beachten Sie, dass der Artikel ist von 1999 und es ist am Leser zu entscheiden, ob die Informationen noch vertrauenswürdig!
Im ersten Fall :
es ist bestimmt zur compile-Zeit, so dass keine Kosten zur Laufzeit.
Im zweiten Fall :
es wird zur Laufzeit ermittelt, weil der compiler nicht wissen. Die jvm hat zu überprüfen, ob Sie können konvertiert werden, um eine Referenz zu
Subtype
und wenn nicht werfenClassCastException
etc. So gibt es einige Kosten.