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
Seite 1 von 2  1 2      
Namenloser

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

AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?

  Alt 1. Nov 2014, 00: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 00:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?

  Alt 1. Nov 2014, 00: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 00:24 Uhr)
  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, 02: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
 
#4

AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?

  Alt 1. Nov 2014, 06: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
Benutzerbild von Desmulator
Desmulator

Registriert seit: 3. Mai 2007
Ort: Bonn
169 Beiträge
 
#5

AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?

  Alt 1. Nov 2014, 09:22
Hat irgendjemand schonmal in betracht gezogen, dass auf einem 64-Bit Windows 32-Bit Anwendungen mittels WOW64 emuliert werden? Das heiß im Klartext:

Zitat:
Trotz der äußerlichen Ähnlichkeit auf allen 64-Bit-Versionen von Windows unterscheidet sich die Implementierung von WOW64 aufgrund der Architektur des Ziel-Prozessors. Die 64-Bit-Version von Windows beispielsweise, welche für Intel-Itanium-2-Prozessoren entwickelt wurde (bei Microsoft IA-64-Architektur genannt), benutzt die Wow64win.dll für die Emulation von x86-Anweisungen mittels des Befehlssatzes des Itanium 2. Diese Emulation ist rechenaufwendiger als die Funktionen der Wow64win.dll auf AMD64-Architekturen, welche lediglich den Prozessor aus dem 64-Bit-Modus in den 32-Bit-Modus schalten, während ein 32-Bit-Thread ausgeführt wird. Auf AMD64-Systemen ist für WOW64 keine Emulation notwendig.
Man könnte tippen, dass du einen Intel-Prozessor hast?
Also werden die Befehle in SOFTWARE verarbeitet und nicht vom Prozessor direkt ausgeführt.

Ich denke, das ist der Hauptgrund, warum das ganze so langsam ist. Wohl gemerkt solltest du dein Programm mal auf einem echten 32-Bit windows testen... vermutlich läuft es dort deutlich schneller.
Lars
There are 10 kinds of people in the world:
those who get binary, and those who don’t.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.881 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?

  Alt 1. Nov 2014, 09:29
Das gilt für IA64 und nicht für X32_64. Dort läuft auch alles nativ auf dem Prozessor
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Desmulator
Desmulator

Registriert seit: 3. Mai 2007
Ort: Bonn
169 Beiträge
 
#7

AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?

  Alt 1. Nov 2014, 09:34
Das gilt für IA64 und nicht für X32_64. Dort läuft auch alles nativ auf dem Prozessor
Hat sich der Fragesteller denn schon zu seiner Prozessorarchitektur geäußert? Habe ich dann wohl überlesen ~ ...
Lars
There are 10 kinds of people in the world:
those who get binary, and those who don’t.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.233 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?

  Alt 1. Nov 2014, 09:43
Das gilt für IA64 und nicht für X32_64. Dort läuft auch alles nativ auf dem Prozessor
Hat sich der Fragesteller denn schon zu seiner Prozessorarchitektur geäußert? Habe ich dann wohl überlesen ~ ...
Im Privatbereich wird man praktisch keine IA64-Rechern antreffen. Und auch bei den Servern dürfte IA64 eher ein Exote sein. Werden die Prozessoren überhaupt noch verkauft?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.233 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?

  Alt 1. Nov 2014, 09:31
Ich denke, das ist der Hauptgrund, warum das ganze so langsam ist. Wohl gemerkt solltest du dein Programm mal auf einem echten 32-Bit windows testen... vermutlich läuft es dort deutlich schneller.
Diese Erklärung gilt nur für die gescheiterte IA64-Architektur. Die jetzt von Intel als x64 (Ursprünglich von AMD entwickelt) bekannte Architektur emuliert für 32-Bit SW gar nix in SW. Alles wird 100% vom Prozessor direkt ausgeführt. Diese SW-Emulation war ein Hauptgrund wieso Intel mit IA64 gescheitert ist. Niemand wollte einen neuen Recher der für 99% der damaligen SW erheblich langsamer gewesen wäre. Einfach mal die Wiki-Artikel zu IA64 und x64 durchlesen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?

  Alt 1. Nov 2014, 15:08
Hast das mal eingegrenzt?
Sind es die Switches? Die Lookups? Die Unterfunktionen?
Wäre doch ein Leichtes, ein paar Tests zu machen.
Habe wie gesagt den VS2013 internen Profiler mehrmals drüberlaufen lassen. Dort sehe ich zwar, welche Funktion wie viel Prozent der Gesamtlaufzeit für sich beansprucht, aber die prozentualen Werte unterscheiden sich bei den 2 Versionen nicht wirklich.
Der einzige Unterschied ist, dass das 32 Bit Kompilat eine durchweg deutlich langsamere absolute Laufzeit hat (das gillt auch für externe Runtime Funktionen wie z.b. "sprintf").

Es gibt auch keine Funktion, welche allein betrachtet herraussticht (alle lowest-level Methoden beanspruchen höchstens mal 4% der Gesamtlaufzeit).

Diese Erklärung gilt nur für die gescheiterte IA64-Architektur. Die jetzt von Intel als x64 (Ursprünglich von AMD entwickelt) bekannte Architektur emuliert für 32-Bit SW gar nix in SW. Alles wird 100% vom Prozessor direkt ausgeführt. Diese SW-Emulation war ein Hauptgrund wieso Intel mit IA64 gescheitert ist. Niemand wollte einen neuen Recher der für 99% der damaligen SW erheblich langsamer gewesen wäre. Einfach mal die Wiki-Artikel zu IA64 und x64 durchlesen.
Exakt. Ich besitze einen "normalen" i7 Prozessor von Intel, welcher die im Desktopbereich übliche x86-64 Architektur verwendet.

Was den Compiler angeht:
Ich verwende wie gesagt Visual Studio 2013, dementsprechend wird mit MSVC12 kompiliert (das Ding ist dem Delphi Compiler was Performance und Optimierung angeht um Jahrzehnte vorraus). Beide Versionen meines Programms habe ich aber als Release kompiliert, von daher werden beide Kompilate auch maximal optimiert. In IDA (Disassembler) konnte ich zudem einen, beim kurzen überfliegen, fast identischen Aufbau der Programme auf Assembler-Ebene feststellen.

Vielleicht bin ich ja Opfer eines Bootkits geworden, dass alle meine 32 Bit Anwendungen Softwareseitig emuliert (ne Spaß bei Seite; das Problem tritt auch auf einem zweiten PC mit Intel Prozessor auf)
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  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 01:05 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-2025 by Thomas Breitkreuz