AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein C++ Enormer Performanceunterschied zwischen 32 und 64 Bit?
Thema durchsuchen
Ansicht
Themen-Optionen

Enormer Performanceunterschied zwischen 32 und 64 Bit?

Ein Thema von Zacherl · begonnen am 31. Okt 2014 · letzter Beitrag vom 4. Nov 2014
Antwort Antwort
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Enormer Performanceunterschied zwischen 32 und 64 Bit?

  Alt 31. Okt 2014, 22:51
Hallo zusammen,

ich arbeite momentan an einem C++ Projekt mit Visual Studio 2013, zu dem ich leider nicht näheres sagen kann. Grob beschrieben ist es ein Parser für ein relativ komplexes Datenformat.

Jetzt habe ich mir mal eine kleine Anwendung geschrieben, welche einfach nur 100MiB an Daten sequenziell dekodiert.

Das Ergebnis hat mich dann doch ziemlich erstaunt (beide Kompilate als Release erstellt):
  • 32 Bit: ~9000ms
  • 64 Bit: ~800ms

Die Dekodierung basiert größtenteils auf arithmetischen und logischen Funktionen, ein paar Lookups in einer Datentabelle, ein paar Switches und das ganze verpackt in einige Unterfunktionen. Dazu kommen noch einige "sprintf" Aufrufe (welche laut Profiler sowohl in der 32, als auch der 64 Bit Version relativ langsam sind).

Ich weiß, es sind recht wenig Infos, aber kann sich jemand erklären, wie die 64 Bit Version über 90% schneller sein kann?

Viele Grüße
Zacherl
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?

  Alt 31. Okt 2014, 23:12
Bei 64 Bit ist der virtuelle Adressraum größer und fragmentiert daher nicht so leicht. Aber ob sich das auf herkömmliche Speichermanager auch auswirkt, weiß ich nicht. Ich habe es nur vor allem bei Firefox beobachtet, dass der unter 64 Bit einfach viel besser läuft als unter 32 Bit, obwohl er netto nicht mal mehr Speicher in Anspruch nimmt. Unter 32 Bit hatte ich alle paar Sekunden Ruckler, wenn der Garbage Collector angesprungen ist, unter 64 Bit läuft alles flüssig.

Ansonsten: Keine Ahnung... Alignment vielleicht? Bessere Cache-Ausnutzung? Oder der Compiler benutzt unter 64 Bit irgendwelche Super-Spezial-Instruktionen...
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?

  Alt 1. Nov 2014, 00:49
Benutze momentan ausschließlich statischen Speicher (bzw. einen Vector, welcher aber nur einmalig alloziiert wird), deshalb denke ich nicht, dass dieser enorme Boost mit geringerer Speicherfragmentierung zu erklären ist.
Spezialinstruktionen kann ich ebenfalls zu 99% ausschließen. Sah auf den ersten Blick in IDA zumindest alles recht ähnlich aus und die selben AVX Instructions, die ich bei der 64 Bit Version finden konnte, existierten meistens auch beim 32 Bit Kompilat.

Hatte den Verdacht, dass es daran liegt, dass ich viele 64 bit Integer verwende (auch unter 32 Bit), aber laut Stackoverflow macht das von der Performance her keinen allzu drastischen unterschied (Addition war glaube ich 2 statt 1 Instruktion, etc).

Die einzigen zwei Dinge, die mir noch in den Sinn kamen, sind:
  1. die effizientere Callingconvention unter 64 Bit
  2. die zusätzlichen 8 General-Purpose Register unter 64 bit

Bloß lese ich überall, dass man bei 64 Bit Kompilaten mit ca. 2-20% Performancezuwachs rechnen kann. In meinem Fall sind es halt über 90%, weshalb ich mir irgendwie Gedanken mache unter 32 Bit auf gut Deutsch irgendwas verkackt zu haben.

Der Profiler von VS2013 kann mir leider auch keinen genaueren Einblick verschaffen. Der prozentuale Anteil der einzelnen Funktionen ist bei beiden Kompilaten in etwa gleich. Der einzige Unterschied ist wirklich, dass die Ausführung der Methoden unter 32 bit signifikant länger dauert.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?

  Alt 1. Nov 2014, 01:01
Benutze momentan ausschließlich statischen Speicher (bzw. einen Vector, welcher aber nur einmalig alloziiert wird), deshalb denke ich nicht, dass dieser enorme Boost mit geringerer Speicherfragmentierung zu erklären ist.
Spezialinstruktionen kann ich ebenfalls zu 99% ausschließen. Sah auf den ersten Blick in IDA zumindest alles recht ähnlich aus und die selben AVX Instructions, die ich bei der 64 Bit Version finden konnte, existierten meistens auch beim 32 Bit Kompilat.

Hatte den Verdacht, dass es daran liegt, dass ich viele 64 bit Integer verwende (auch unter 32 Bit), aber laut Stackoverflow macht das von der Performance her keinen allzu drastischen unterschied (Addition war glaube ich 2 statt 1 Instruktion, etc).
Könnte mir schon vorstellen, dass das einen ziemlichen Unterschied macht, nicht nur wegen weniger Instruktionen, sondern auch weil ein Int64 unter 64 Bit genau in ein Register passt. Ich weiß nicht, ob unter 32 Bit der Compiler überhaupt in der Lage ist, 64 Bit-Integer in Registern zu speichern, oder ob sich dort dann alles zwangsweise auf dem langsameren Stack abspielt (und höchstens mal eine Hälfte für Zwischenberechnungen in ein Register geladen wird). Aber so oder so bleiben natürlich unter 64 Bit dadurch viel mehr freie Register übrig, die entsprechend genutzt werden können. Dazu kommen dann noch obendrauf nochmal die zusätzlichen 8 Register.

Edit:
Du könntest ja mal valgrind drauf loslassen. Soweit ich weiß kann man sich da auch Statistiken zur CPU-Cache-Effizienz und ähnlichem Low-Level-Kram ausgeben lassen.

Geändert von Namenloser ( 1. Nov 2014 um 01:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.313 Beiträge
 
Delphi 12 Athens
 
#5

AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?

  Alt 1. Nov 2014, 01:19
Eine 32-Bit-CPU/FPU, bzw. der 32-Bit Teil einer CPU, für die 32-Bit-Programme, kann natürlich nur mit 32-Bit-Integern rechnen.
Bei Fließkommazahlen bis 64/80 Bit.

Wenn ihr mal in die CPU-Ansicht schauen würdet, dann hättet ihr bemerkt, daß 64-Bit-Integeroperationen in Win32 nur "emuliert" werden, indem die Rechenoperationen auf zwei 32-Bit-Integer aufgeteilt werden, was natürlich nicht wirklich schnell sein kann.

PS: schaut mal in die System.pas und haltet ausschau nach
Delphi-Quellcode:
{ 64-bit Integer helper routines }
{$IF defined(CPU386)}
procedure __llmul;
procedure __lldiv;
procedure __lludiv;
procedure __llmod;
procedure __llmulo;
procedure __lldivo;
procedure __llmodo;
procedure __llumod;
procedure __llshl;
procedure __llushr;
{$ENDIF}
Das sint praktisch die Funktionen, welche Delphi/C++ intern benutzt, wenn man *, div, mod, shl usw. auf Int64 oder UInt64 anwendet.

Ja, via SSE/MMX gibt es auch in Win32 ein paar 64- und 128-Bit-Register, aber diese sind ja nicht für einen Wert vorgesehn, sondern stellen eine Technik zur Stream-/Parallelverarbeitung mehrerer gleichartiger Berechnungen dar.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 1. Nov 2014 um 01:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?

  Alt 1. Nov 2014, 03:56
Du könntest ja mal valgrind drauf loslassen. Soweit ich weiß kann man sich da auch Statistiken zur CPU-Cache-Effizienz und ähnlichem Low-Level-Kram ausgeben lassen.
Danke, ich werds mir mal anschauen!

Wenn ihr mal in die CPU-Ansicht schauen würdet, dann hättet ihr bemerkt, daß 64-Bit-Integeroperationen in Win32 nur "emuliert" werden, indem die Rechenoperationen auf zwei 32-Bit-Integer aufgeteilt werden, was natürlich nicht wirklich schnell sein kann.
Das ist mir schon bewusst, deshalb hatte ich ja auch den entsprechenden Verdacht, dass es an der expliziten Verwendung des uint64_t Datentyps liegen könnte Die Sache ist, dass nur ca. 5% der Berechnungen wirklich mit diesen Variablen durchgeführt werden. Eben da, wo es wirklich notwendig ist einen großen Integertyp zu verwenden. Das kann einfach nicht einen Performanceunterschied von über 90% ausmachen

Da die Verteilung im Profiler doch ziemlich gleich aussieht, ist der für mich plausibelste Grund momentan die Existenz der 8 zusätzlichen GP-Register und die langsamere Callingconvention.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#7

AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?

  Alt 1. Nov 2014, 07:48
Hast das mal eingegrenzt?
Sind es die Switches? Die Lookups? Die Unterfunktionen?
Wäre doch ein Leichtes, ein paar Tests zu machen.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#8

AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?

  Alt 4. Nov 2014, 13:10
  • 32 Bit: ~9000ms
  • 64 Bit: ~800ms

[...]

die 64 Bit Version über 90% schneller sein kann?
90%?

Sind es nicht eher 10%?

Das Ergebnis hat mich dann doch ziemlich erstaunt (beide Kompilate als Release erstellt):
Weil der Unterschied so gering ist? Der wird ohnehin immer geringer. Wachstum verläuft anfänglich exponentiell, gerät aber irgendwann in seine Sättigung und flacht wieder ab (so daß es eher eine Hyperbeltangensfunktion gleicht). Wir sind schon wieder im abflachenden Zweig, sodaß bei den Bitanzahlverdoppelungen die tatsächlichen Geschwindigkeitssteigerungen immer mehr den erhofften hinterherhinken.
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#9

AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?

  Alt 4. Nov 2014, 13:14
Zähl mal die Nullen.

Da steht 9s und 0,8s. Gibt also rund 91%.
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#10

AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?

  Alt 4. Nov 2014, 15:44
Von den Nullen her stimmts doch. 90 hat eine Null, 10 hat eine Null. Und eine Null ist es ja auch weniger.
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz