Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Integer vs. byte (https://www.delphipraxis.net/1090-integer-vs-byte.html)

Sebastian Nintemann 16. Okt 2002 20:51


Integer vs. byte
 
Hallo!

aus der Delphi Hilfe:
Zitat:

The generic integer types are Integer and Cardinal; use these whenever possible, since they result in the best performance for the underlying CPU and operating system.
Ich hab mehrere Variablen in einem Programm, die
1.) Integertypen sein müssen
2.) Nur positive Werte annehmen
3.) Nur Werte unter 255 annehmen
4.) auch als Laufvariablen für Schleifen verwendet werden

Ist es ratsam da bytes zu nehmen oder Integer bzw Cardinal? Sind diese auch schneller als ein byte? Ich meine soo viele Variablen sind es nicht dass ich mir wegen der Größe Gedanken machen müsste. Würd mich mal interessieren wie ihr sowas macht :?:

Gruß, Sebastian

jbg 16. Okt 2002 21:06

Da der Delphi-Compiler die Datenfelder ausrichtet kann es sein, dass ein Byte genauso viel Speicherplatz wie ein Integer belegen kann. Das nur mal so zur Programmgröße.

Da heutige Prozessoren mit einer 32 bzw. 64 Bit breiten Datenleitung auf den Arbeitsspeicher zugreifen, kann ein 32 Bit-Integer auf einmal eingelesen werden. Bei einem Byte werden zusätzlich 24 nicht benötigte Bits eingelesen. Im Prinzip gibt es somit kaum einen Geschwindigkeitsverlust, wobei die Maschinenbefehle mittlerweile für 32-Bit Operationen optimiert sind.

PS: Sollte ich falsch liegen, dann bitte verbessern.

Christian Seehase 17. Okt 2002 01:28

Moin Sebastian,

solltest Du Records benötigen, dann auf keinen Fall als packed record Deklarieren, so es vermeidbar ist, denn ansonsten kann es Dir passieren, je nach Aufbau des Records, dass die Variablen nicht auf 32 Bit Grenzen ausgerichtet sind, und somit beim Zugriff mit einem sogenannten "Alignment Error" "bestraft" werden (das läuft CPU intern ab und hat nichts mit Fehlermeldungen zu tun).
Dadurch würde die Geschwindigkeit, unter Umständen spürbar, beeinträchtigt werden.

Bei den Vorgaben die Du hast, erscheint mir Cardinal am sinnvollsten zu sein.
Dann wärest Du sogar bei einem Wechsel des Compilers auf eine 64 Bit Version auf der sicheren Seite, denn dann würde Cardinal als 64 Bit ohne Vorzeichen compiliert werden, was auf einem 64 Bit Prozessor von das Alignmentproblem automatisch umgeht. (Ich weiss, Zukunftsmusik, aber schon hörbar ;-))

Generic Integer heisst ja nichts anderes, als dass es die Typen sind, deren Grösse (in Bit) immer der Datenbreite der CPU entsprechen, für die der Compiler ausgelegt ist.

(integer = mit Vorzeichen, cardinal = ohne Vorzeichen)

sakura 17. Okt 2002 09:12

Byte vs. Integer in Schleifen.

Hi Sebastian,

es bringt absolut keine Vorteile eine Byte-Schleifen-Variable gegenüber einer Integer-SV zu nutzen. Der Kompiler hat u.U. sogar mehr Arbeit. Simple Erklärung.

Der Kompiler übersetzt Schleifenvariablen in ein bis zwei Register (je nach dem, ob diese innerhalb der Schleife genutzt werden). Der Schleifenregister wird auf die Differenz zwischen Anfang und Ende der Schleife gesetzt und in das 32-Bit (Integer) Register ECX geschrieben. Dieses wird solange heruntergezählt, bis es 0 ist. Das zweite Register (i.a. DL, DX, oder EDX) wird von Anfangswert solange heraufgezählt, bis die Schleife beendet wurde.

Wie auch immer, ECX ist der Zähler, und dieser ist vom Typ Integer. Wenn ein Byte in ein 32-Bit Register geladen wird, so muss dieses vorher gelöscht werden, das ist auf modernen Rechnern eine Extraaufwand von 2 Taktzyklen.

Abschluss

Wenn Du die Routine in einer rechenintensiven Umgebung nutzt, dann nutze immer Integervariablen. Wenn die Routine "nur mal so" genutzt wird, dann empfehle ich das zu nutzen, was Dir während der Entwicklung Vorteile bringt.

...:cat:...

Sebastian Nintemann 18. Okt 2002 07:18

Guten Morgen, danke für die Antworten! Ich denk auch, dass Cardinal dann hier am besten passt (ich war auch von vornherein am überlegen cardinal oder byte). Also danke nochmal für die Infos :wink:

Gruß, Sebastian

sakura 18. Okt 2002 08:17

Noch mal abschließend Borlands Standpunkt:

Für Schleifen ist es, wenn Du den Zähler nicht zum direkten Speichern nutzt, immer am besten Integer zu nehmen, da für diesen bei der Kompilierung immer der effektivste genommen wird. Unter Delphi 1 war es das Register CX (16 Bit), seit Delphi 2 ist es ECX (32 bit), und in der 64 Bit Variante von Delphi, welche auch mal kommen wird, wird es entsprechend ein 64 Bit Register werden.

Sebastian Nintemann 18. Okt 2002 15:25

Hallo nochmal, was meinst du mit direktem speichern? Ich benutze die Laufvariablen um gezielt auf Arrays zuzugreifen.

Gruß, Sebastian

.. jetzt wollt ich doch glatt auf F9 drücken um den Post abzuschicken... :spin:

sakura 18. Okt 2002 15:32

Direktes Speichern :: Speichern des Integers in eine Datei.

Sebastian Nintemann 18. Okt 2002 15:47

Nene sowas mach ich nicht :mrgreen:
Also Integer auch Cardinal vorziehen, oder meintest du mit Integer diese beiden Typen? Der einzige Unterschied zwischen den beiden Typen liegt doch im Vorzeichen oder?

Gruß, Sebastian

sakura 18. Okt 2002 15:50

Integer vorziehen.

Momentan ist der einzige Unterschied dieses Vorzeichen, aber mit der ersten 64-Bit Version wird der Unterschied größer.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:05 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz