AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Integer vs. byte

Ein Thema von Sebastian Nintemann · begonnen am 16. Okt 2002 · letzter Beitrag vom 18. Okt 2002
Antwort Antwort
Seite 1 von 2  1 2      
Sebastian Nintemann
(Gast)

n/a Beiträge
 
#1

Integer vs. byte

  Alt 16. Okt 2002, 21:51
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
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2
  Alt 16. Okt 2002, 22: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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#3
  Alt 17. Okt 2002, 02: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)
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#4
  Alt 17. Okt 2002, 10: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.

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Sebastian Nintemann
(Gast)

n/a Beiträge
 
#5
  Alt 18. Okt 2002, 08: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

Gruß, Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#6
  Alt 18. Okt 2002, 09: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.
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Sebastian Nintemann
(Gast)

n/a Beiträge
 
#7
  Alt 18. Okt 2002, 16: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...
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#8
  Alt 18. Okt 2002, 16:32
Direktes Speichern :: Speichern des Integers in eine Datei.
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Sebastian Nintemann
(Gast)

n/a Beiträge
 
#9
  Alt 18. Okt 2002, 16:47
Nene sowas mach ich nicht
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
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#10
  Alt 18. Okt 2002, 16:50
Integer vorziehen.

Momentan ist der einzige Unterschied dieses Vorzeichen, aber mit der ersten 64-Bit Version wird der Unterschied größer.
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:39 Uhr.
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