For-Schleifen - byte statt int?

Status
Nicht offen für weitere Antworten.

Meldanor

Bekanntes Mitglied
Hi Leute,

der primitive Datentyp byte kann Zahlen von -2^7 bis 2^7 -1 speichern, int ja -2^31 bis 2^31 -1, da byte 8 bit zur verfügung hat und int 32.
AUch wenn diese Frage absolut minimalistisch ist:

Ist es speichereffizienter in einer for schleife statt dem üblichen int bytezu verwenden?

Ich spreche hier von for schleifen, wo ich die Anzahl der schleifen exakt weiß wie

Java:
for(int i = 0 ; i < 10 ; ++i)

und nicht von schleifen, wo i eine beliebige größe haben kann wie

Java:
for(int i = 0 ; i < liste.length ; ++i)

Natürlich gehe ich auch davon aus, dass i niemals einen Wert von > byte erreichen kann(oder short , je nachdem).

Eine Anschlussfrage ist, ob es sich lohnt, wenn i in der Schleife benutzt wird und zum Beispiel ein Methode n-mal aufgerufen wird mit einem Paramater int wie z.B. bei PreparedStatements.
Bsp:
Java:
for(byte i = 0 ; i < 3 ; ++i){
    updateAllMaxMemberStatement.setString(i+1, data[i]);
    deletePupilFromAllStandsStatement.setString(i+1, data[i]);
    deleteSinglePupilStatement.setString(i+1, data[i]);

}
Es wird ja dann i, was ein byte ist, nach int gecasted, oder? Gehen wir davon aus, dass byte statt int wirklich speicher-effizienter ist, so stellt sich hier die Frage:
Ist die Effizenz des Speicherns nichtig, da eine Cast dies aufhebt(keine Ahnung, ob ein Cast mehr Speicher verbraucht als ein Zahl, die schon immer ein Int war oder ob dieser Vorgang Rechenleistung verbraucht).

Bitte vergesst nicht, ich weiß, dass ich mich hier um bits und bytes streite, mich interessiert nur, ob dies ein korrekter Gedankengang ist oder aber ich falsch liege auf Grund von Java Internen Mechanismen.

Mfg
mel
 
Zuletzt bearbeitet:

tfa

Top Contributor
Der Speicherverbrauch eines Bytes hängt von der jeweiligen Implementierung der JVM ab. Normalerweise ist es effizienter, wenn Daten bzw. Objekte "aligned" im Speicher liegen. Also kann es durchaus sein, dass ein byte tatsächlich 32 oder gar 64 Bit beansprucht. Jedenfalls ist der Unterschied im Verbrauch so gering, dass unnötig ist, sich darüber den Kopf zu zerbrechen.
(Bei großen byte-Arrays sollten allerdings schon gepackt im Speicher liegen.)
 

Marco13

Top Contributor
Bei Variablen ist es egal: Jedes byte, short oder char wird innerhalb der JVM automatisch als ein int (32 bit) verrechnet.
 

Marco13

Top Contributor
Mit der (zugegeben vielleicht etwas unpräzisen) Formulierung "Bei Variablen..." meinte ich, dass bei sowas wie
byte a = 1;
byte b = 2;
byte c = a+b;
in der letzten Zeile innerhalb der VM tatsächlich zwei 32bit-Werte addiert werden. Dass die Daten als Array unterscheidlich viel Speicher belegen ist ja klar :)
 

tfa

Top Contributor
Ich nahm an, es ging dem TS um den Speicherplatz der byte-Variablen (in dem Test aus dem Link stehen auch nur Variablen, keine Arrays).
 

Meldanor

Bekanntes Mitglied
Ja, da es mir hier primär um die temporären Variablen in einer Vorschleife geht.
Danke für die bisherigen Antworten.
Also ist es vorallem von der JVM abhängig?
 

tfa

Top Contributor
Ja, aber wie gesagt, es ist völlig unerheblich, ob da nun 1 oder 4 oder 8 Bytes verwendet werden. Hauptsache dein Programm funktioniert. Speicher ist billig. Oder schreibst du Java-Programme für Smart-Cards?
 

Meldanor

Bekanntes Mitglied
Nee...speicher hab ich hier genug und das ist auhc nicht das Problem.
Ich sagte ja bereits, dass ich mir bewusst bin, dass ich über Bits und Bytes diskutiere. Es war eher eine ... theoretische Sache als eine praktische.
Mir fiel jedoch in dem Zusammenhang noch eine Frage ein:
Wenn, wie du sagtest, die JVM automatisch das regelt, wozu existieren dann byte,short etc. überhaupt, wenn sie weniger speichern können,aber genau soviel Speicher wie ein int verbrauchen?
 

musiKk

Top Contributor
"Theoretische Sache" klingt meist wie premature Optimization. Sowas kann von Fall zu Fall unterschiedlich sein.

Dass es short überhaupt gibt, habe ich bis vor kurzem gar nicht mehr richtig vor Augen gehabt. Ich kann mich gar nicht erinnern, das je in fremdem Code gesehen zu haben und verwende es selbst auch nicht. Byte nehme ich für I/O. Und sonst gibts ja nur noch int und long und da gibt es auch einen tatsächlichen Unterschied im Speicherverbrauch.
 

Ark

Top Contributor
Die unterschiedlichen Datentypen verbrauchen schon unterschiedlich viel Speicher, sonst würde es sie ja gar nicht geben.

Zumindest solange sie nur im Arbeitsspeicher rumlungern, verbrauchen sie zunächst(!) genau den durch den Datentyp bestimmten Speicherplatz. Wenn sie jedoch in Register geladen werden, um Berechnungen durchzuführen, so kann davon ausgegangen werden, dass sie die ganze Breite des Registers beanspruchen, vor allem, wenn sie zusammen mit int verarbeitet werden.

Wie wirkt sich das aus? Stellen wir uns vor, unser Prozessor arbeitet mit 32 Bit breiten Registern. Wenn wir ein int laden, können wir dessen Wert direkt mit einem Befehl ins Register schieben. Wenn wir jedoch nur ein byte laden, dann gibt es zwei Möglichkeiten:

  1. Im Arbeitsspeicher wird der obere Bereich, der durch das byte eigentlich nicht belegt wird, auf 0 gesetzt bzw. mit Nullen aufgefüllt, damit beim Zugriff direkt die oberen Bits richtig gesetzt sind. So kann die Zahl in den Prozessor geladen werden, als handle es sich um ein int. Nachteil: Wir brauchen mehr Speicher. Das nennt sich dann Alignment. (Entsprechendes gilt bei negativem Vorzeichen.)
  2. Der verbrauchte Platz im Arbeitsspeicher bleibt bei dem einen Byte, den ein byte nun mal belegt. Dadurch spart man Arbeitsspeicher, aber nachdem das byte in die unteren 8 Bits des Registers geladen wurden, müssen nachträglich die oberen Bits im Register je nach Vorzeichen gesetzt oder gelöscht werden, wenn die Operation mit einem weiteren Operanden größeren Datentyps (z.B. int) durchgeführt wird. Dieser Vorgang kostet Zeit.
Nachdem in irgendeiner Spezifikation (glaube ich jedenfalls) steht, dass alle 32-Bit-Operationen einer JVM in einem Zug abgearbeitet werden müssen, sollte es nicht verwunderlich sein, dass int der schnellste Datentyp ist. (Möglicherweise werfe ich hier auch gerade Dinge in einen Topf, die nichts miteinander zu tun haben. ^^) long benötigt mehr Zeit, zumindest auf 32-Bit-Maschinen, da hier die Operationen in mehreren Zügen durchgeführt werden müssen.

Ark
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Lohnt sich byte und short bei Schleifen? Allgemeine Java-Themen 9
F KI / Machine Learning Parameter verschachtelte for Schleifen Allgemeine Java-Themen 2
F KI / Machine Learning Parameter verschachtelte for Schleifen Allgemeine Java-Themen 1
A Mehrere for-Schleifen Allgemeine Java-Themen 2
Monokuma Foreach Schleifen in Streams umändern Allgemeine Java-Themen 23
Junger_Basileus Attribute, Arrays, Schleifen Allgemeine Java-Themen 9
E Angabe wie groß Array sein soll und in for-schleifen diesen Array füllen Allgemeine Java-Themen 3
D Integer-Array variabler Größe mit Zahlen befüllen (Schleifen) Allgemeine Java-Themen 0
C Schachbrett mit while-schleifen Allgemeine Java-Themen 7
P Erste Schritte Dynamische Anzahl von verschachtelten Schleifen Allgemeine Java-Themen 5
R kann man irgendwie mit Arrays mit Eingabefenstern und Schleifen Werte abklappern? Allgemeine Java-Themen 2
R n verschachtelte Schleifen? Allgemeine Java-Themen 14
S Welcher Schleifen type für eine Berechnung Allgemeine Java-Themen 7
R Schleifen Allgemeine Java-Themen 11
L for-Schleifen Zählfehler Allgemeine Java-Themen 6
G Code nach Schleifen und Verzweigungen durchsuchen Allgemeine Java-Themen 6
S verzweigungen und schleifen Allgemeine Java-Themen 24
B BigDecimal Schleifen Allgemeine Java-Themen 9
prakdi Zeit zum Durchlauf der Schleifen unverständlich!? Allgemeine Java-Themen 3
B Auslagerung von verschachtelten Schleifen Allgemeine Java-Themen 11
T Verschachtelte Schleifen abbrechen Allgemeine Java-Themen 3
S Verschachtelte Schleifen Allgemeine Java-Themen 9
Z GC -> Allokation in Schleifen Allgemeine Java-Themen 25
A Fibonacci-Zahlen & kopfgesteuerte Schleifen & Strukt Allgemeine Java-Themen 8
V Vererbung und Schleifen Allgemeine Java-Themen 5
W kompliziertes Konstrukt von Schleifen/If/else. Rekursion? Allgemeine Java-Themen 22
S schleifen Allgemeine Java-Themen 3
A Schleifen in Ant? Allgemeine Java-Themen 5
G Methode mit Schleifen NullPointerException Allgemeine Java-Themen 2
L Schleife über Schleifen Allgemeine Java-Themen 4
M Verschachtelte Schleifen (unbekannte Tiefe) Allgemeine Java-Themen 3
N Code verkürzen(mit schleifen)? Allgemeine Java-Themen 10
C Effektivitaet bei for Schleifen Allgemeine Java-Themen 18
C Performance von FOR Schleifen Allgemeine Java-Themen 25
P Schleifen liefern Werte nicht wie erwartet Allgemeine Java-Themen 2
LucasGlockner Effizienter byte-Zugriff auf ein long[]-Array Allgemeine Java-Themen 8
Encera Größe eines Objektes in Byte berechnen Allgemeine Java-Themen 2
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
Thallius unsigned byte Allgemeine Java-Themen 18
N Byte Array in Java "dekomprimieren" Allgemeine Java-Themen 3
kodela Datentypen byte als unsigned interpretieren Allgemeine Java-Themen 23
W String -> byte[] -> String - Sieht jemand was ich nicht sehe? Allgemeine Java-Themen 10
TheWhiteShadow 2D-Grafik GIF Library mit byte output Allgemeine Java-Themen 10
K Data Konverter - Probleme mit Byte[] Kodierung Allgemeine Java-Themen 3
kodela Byte Order Mark (BOM) bei readLine() ignorieren Allgemeine Java-Themen 5
A Byte zu String Allgemeine Java-Themen 4
RalleYTN Datentypen Unsignierter Byte zum signierten Byte Allgemeine Java-Themen 2
X Datentypen Byte geht nicht höher als 126 auch nicht mit casten? Allgemeine Java-Themen 22
R Byte Array Zeichensuche Allgemeine Java-Themen 6
M Null byte in verschiedenen charsets Allgemeine Java-Themen 2
S Byte Array welches in Laufzeit aufgelöst wird // Objekt Array Allgemeine Java-Themen 3
O Byte-Array zu String Allgemeine Java-Themen 7
D Decodierung von Mp3-byte[] Allgemeine Java-Themen 4
A ByteBuffer.get(byte[] dst,int offset,int length) Allgemeine Java-Themen 2
A RandomAccessFile.read(byte[] b) Allgemeine Java-Themen 9
P Datentypen Warum überhaupt Byte ? Allgemeine Java-Themen 12
P Datentypen String-Daten zu Byte-Zahlen konvertieren - Komme nicht weiter nach vielem versuchen :-/ Allgemeine Java-Themen 7
E Byte zu String & umgekehrt Allgemeine Java-Themen 3
B BufferedWriter in InputStream oder Zeichen-Stream in Byte-Stream Allgemeine Java-Themen 5
M Chart per byte[] in JSP anzeigen Allgemeine Java-Themen 4
E int in byte Allgemeine Java-Themen 6
R ArrayList byte[] abspeichern Allgemeine Java-Themen 4
S byte [] in string und zurück konvertieren Allgemeine Java-Themen 2
G byte ? : Allgemeine Java-Themen 7
E Byte-Array to String: Zeichenkaputt Allgemeine Java-Themen 11
R In einem Byte-Array nach einer gewissen Zahlenfolge suchen Allgemeine Java-Themen 7
hdi Speicherbelegung byte, short, int Allgemeine Java-Themen 8
J byte - hex - byte.. casten Allgemeine Java-Themen 8
R byte[] to String Konvertieren Allgemeine Java-Themen 14
A Input/Output Buffered Image zu Byte Array und zurück konvertieren Allgemeine Java-Themen 4
M byte array splitten Allgemeine Java-Themen 3
J Hex-String zu byte transformieren Allgemeine Java-Themen 7
T Zu doof für byte-Umrechnung ... Allgemeine Java-Themen 3
W CRC32 aus byte array Allgemeine Java-Themen 5
F byte[] aus einem BufferedImage Allgemeine Java-Themen 3
L byte -> byte[1] -> byte Allgemeine Java-Themen 2
P Einzelne Bits in einem Byte-Array setzen Allgemeine Java-Themen 2
Kr0e Synchronisieren: boolean,byte,char ? Allgemeine Java-Themen 2
S Überprüfung/Parsen eines Byte-Arrays Allgemeine Java-Themen 9
Semox Byte-Manipulation eines Bildes Allgemeine Java-Themen 7
C int zu byte cast - verständnis Allgemeine Java-Themen 3
R int to byte[] Array Allgemeine Java-Themen 4
MQue byte[] Array to Integer Allgemeine Java-Themen 4
MQue Byte to Int convertieren Allgemeine Java-Themen 2
R Double Werte aus byte[] auslesen Allgemeine Java-Themen 5
W Verwendung von byte Allgemeine Java-Themen 9
G zu lange Byte code dateien Allgemeine Java-Themen 6
G String in byte- Array Allgemeine Java-Themen 3
E Byte [] nach hex, dann nach dec Allgemeine Java-Themen 2
A Performance: byte[] in byte[][][] konvertieren Allgemeine Java-Themen 2
G 2 x byte zusammenkopieren Allgemeine Java-Themen 7
G byte nach int Allgemeine Java-Themen 3
foobar Object to byte[] ohne Serializable Allgemeine Java-Themen 6
data89 Die Größe eines Strings in Byte berechnen? Allgemeine Java-Themen 12
G Byte- List mit einem Iterator durchlaufen Allgemeine Java-Themen 5
W Konflikt byte->int, in.read->arraycopy Allgemeine Java-Themen 7
T "unsigned" byte[] -> BigInteger Allgemeine Java-Themen 2
F byte in hex-String oder: Wer hat in Mathe aufgepasst Allgemeine Java-Themen 3
T Socket Server Anwendung - Empfang eines Byte-Arrays Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben