Forum: PC-Programmierung C+ Performance. Verarbeitung Gleitkommazahlen und/oder Ganzzahlen


von Schlosi (Gast)


Lesenswert?

Hallo,

kennt jemand Werte oder zumindest eine theoretische Tendenz wie die 
Performanceunterschiede von Datentypen sind? Natürlich hängt das von 
Faktoren wie Hardware usw ab aber gehen wir mal von einem aktuellen 
"normalen Computer" mit einer 64-Bit-Architektur aus bei einem C++ 
Programm.

unsigned int
int
float
double

Wie sind in etwa die prozentualen Performanceunterschiede der genannten 
Datentypen nur mal so als Anhaltspunkt?, konnte leider nichts finden.

ps: interessant wären darüber hinaus auch die Unterschiede wenn 
Rechnungen mit nicht nur gleichen sondern unterschiedlichen Datentypen 
stattfinden zB Rechnungen:

integer mit integer
vs
integer mit double
vs
double mit double

Grüße

von Jim M. (turboj)


Lesenswert?

Schlosi schrieb:
> Natürlich hängt das von
> Faktoren wie Hardware usw ab aber gehen wir mal von einem aktuellen
> "normalen Computer" mit einer 64-Bit-Architektur aus bei einem C++
> Programm.

Auf einem aktuellen 64-bitter mit vernünftiger FPU hast Du Probleme die 
Unterschiede vernünftig zu messen.

Denn Code für double und int macht i.d.R. nicht 100%ig dasselbe.

Und: "Einfache" Berechnungen sind oftmal schneller als die zugehörigen 
Speicherzugriffe.

von Nase (Gast)


Lesenswert?

Schlosi schrieb:
> interessant wären darüber hinaus auch die Unterschiede wenn
> Rechnungen mit nicht nur gleichen sondern unterschiedlichen Datentypen
> stattfinden
Die gibt es eigentlich nicht.
Wenn einer der Operanden ein Gleitkommatyp ist, dann wird der anderen 
auch zu einem solchen erweitert.

von Heiko L. (zer0)


Lesenswert?


von tictactoe (Gast)


Lesenswert?

Soweit ich mich erinnere, stechen nur diese Operationen hervor:

Integer-Multiplikation ist tendenziell langsamer als 
Floatingpoint-Multiplikation.

Floatingpoint-Division ist noch langsamer, also vermeiden wenn geht.

Integer-Division ist der Horror (belegt die ganze Integer-Pipeline für 
Dutzende von Cycles, sodass der Core keine andere Operation parallel 
dazu machen kann, nicht mal ein anderer Hyperthread).

Das ist zumindest die Richtlinien, nach denen ich Code schreibe. Aber 
ich lasse mich gerne eines besseren belehren.

Beitrag #5444418 wurde vom Autor gelöscht.
von Carl D. (jcw2)


Lesenswert?

tictactoe schrieb:
> Soweit ich mich erinnere, stechen nur diese Operationen hervor:
>
> Integer-Multiplikation ist tendenziell langsamer als
> Floatingpoint-Multiplikation.
Wieso sollte da ein Unterschied bestehen, beide haben 64Bit Mantisse, 
float muß noch zusätzlich mit den Exponenten hantieren.
*)1..7 Clks für Int/Float

> Floatingpoint-Division ist noch langsamer, also vermeiden wenn geht.
*)10..40 Clks

> Integer-Division ist der Horror (belegt die ganze Integer-Pipeline für
> Dutzende von Cycles, sodass der Core keine andere Operation parallel
> dazu machen kann, nicht mal ein anderer Hyperthread).
*)15..40 Clks

> Das ist zumindest die Richtlinien, nach denen ich Code schreibe. Aber
> ich lasse mich gerne eines besseren belehren.
Wichtiger als Int oder Float ist das Layout der Daten, denn ein Zugriff 
auf den Hauptspeicher kostet 109..150 Clks *)

*) http://ithare.com/infographics-operation-costs-in-cpu-clock-cycles/
 Ja, diese Übersicht ist von September 2016, manches könnte inzwischen 
schneller sein. Speicher aber eher nicht.

von Rolf M. (rmagnus)


Angehängte Dateien:

Lesenswert?

Carl D. schrieb:
>> Das ist zumindest die Richtlinien, nach denen ich Code schreibe. Aber
>> ich lasse mich gerne eines besseren belehren.
> Wichtiger als Int oder Float ist das Layout der Daten, denn ein Zugriff
> auf den Hauptspeicher kostet 109..150 Clks *)

Das scheint mir recht wenig. Das angehängte Bild stammt von einer 
Präsentation eines Kernel-Entwicklers von 2002. Damals hatten die 
Prozessoren noch keine 3 Cache-Ebenen, was mich vermuten lässt, dass 
Hauptspeicher-Zugriffe inzwischen noch erheblich mehr Takte brauchen.

von Carl D. (jcw2)


Lesenswert?

Rolf M. schrieb:
> Carl D. schrieb:
>>> Das ist zumindest die Richtlinien, nach denen ich Code schreibe. Aber
>>> ich lasse mich gerne eines besseren belehren.
>> Wichtiger als Int oder Float ist das Layout der Daten, denn ein Zugriff
>> auf den Hauptspeicher kostet 109..150 Clks *)
>
> Das scheint mir recht wenig. Das angehängte Bild stammt von einer
> Präsentation eines Kernel-Entwicklers von 2002. Damals hatten die
> Prozessoren noch keine 3 Cache-Ebenen, was mich vermuten lässt, dass
> Hauptspeicher-Zugriffe inzwischen noch erheblich mehr Takte brauchen.

Abgesehen von meinem "9 statt 0"-Vertipper:
2002 hatte man fast die selben CPU-Taktfrequenzen wie heute (nur damals 
eher zum Heizen als zum Rechnen). Sollten also 
Speicher/Speicherinterface in den 14 Jahren nicht um den Faktor 2 besser 
geworden sein, wäre ich enttäuscht
;-)

von Adder (Gast)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.