AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Schnelle Alternativen für Multiplikation mit 2

Schnelle Alternativen für Multiplikation mit 2

Ein Thema von Delphi-Laie · begonnen am 16. Jan 2012 · letzter Beitrag vom 23. Jan 2012
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.667 Beiträge
 
Delphi 12 Athens
 
#1

AW: Schnelle Alternativen für Multiplikation mit 2

  Alt 16. Jan 2012, 13:43
Wenn man Ahnung davon hat (ich habe sie nicht), dann kann man sich die verschiedenen Varianten ja einmal im resultierenden Assembler-Code ansehen. Allerdings denke ich, dass, wenn überhaupt Geschwindigkeitsunterschiede bestehen sollten, diese wahrscheinlich allenfalls marginal sind. Wichtiger ist es IMO, dass der Code lesbar und nachvollziehbar (und somit auch leicht wartbar) ist. Wenn man also mit Bitmasken hantiert, dann ist das Bitshifting in diesem Kontext logisch. In anderen Zusammenhängen könnte es den Betrachter (das ist man im Zweifel selbst nach ein paar Monaten) nur verwirren.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

AW: Schnelle Alternativen für Multiplikation mit 2

  Alt 16. Jan 2012, 13:50
Multiplikationen und Divisionen mit den Konstanten 2,4,8,16,... werden vom Delphi Compiler automatisch in einen Links- oder Rechtshift übersetzt.
Delphi-Quellcode:
x := x * 256;
x := x shl 8;
Man kann sich also die Shift-Operationen hier sparen.
Was anderes ist es, wenn erst während der Laufzeit der Multiplikator oder Divisor feststeht.
Dann macht eine Shiftoperation natürlich Sinn.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.165 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Schnelle Alternativen für Multiplikation mit 2

  Alt 17. Jan 2012, 14:31
Multiplikationen und Divisionen mit den Konstanten 2,4,8,16,... werden vom Delphi Compiler automatisch in einen Links- oder Rechtshift übersetzt.
Delphi-Quellcode:
x := x * 256;
x := x shl 8;
Man kann sich also die Shift-Operationen hier sparen.
Was anderes ist es, wenn erst während der Laufzeit der Multiplikator oder Divisor feststeht.
Dann macht eine Shiftoperation natürlich Sinn.
Theorie und Praxis...

Delphi-Quellcode:
Aus: A := A * 8; wird

Add ebx,ebx
Add ebx,ebx
Add ebx,ebx

Aus: A := A div 2; wird

mov ecx,2
mov eax,ebx
cdq
idev ecx
mov ebx,eax
Mavarik
  Mit Zitat antworten Zitat
Namenloser

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

AW: Schnelle Alternativen für Multiplikation mit 2

  Alt 17. Jan 2012, 14:44
Wieso macht der Compiler das? Alignment? Ich hab’s mal getestet, und es ist (auf meinem Core 2) sowohl langsamer als die echte Multiplikation als auch das Shifting:
Code:
Add, Add, Add: 1435
Shl: 421
IMul: 1264
(das ganze sind Millisekunden für jeweils 1 000 000 000 Durchläufe)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.165 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Schnelle Alternativen für Multiplikation mit 2

  Alt 17. Jan 2012, 15:31
Wieso macht der Compiler das?
Habe aufgegeben eine Antwort auf diese Frage zu suchen...

Mavarik
  Mit Zitat antworten Zitat
Delphi-Laie

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

AW: Schnelle Alternativen für Multiplikation mit 2

  Alt 23. Jan 2012, 08:21
Ich erlaube mir, dieses leicht angetagte Thema noch einmal aufzuwärmen.

Der (bzw. die) Delphicompiler optmiert (optimieren) also in mehrerlei Hinsicht. Da dieses Forum auch ein Lazarusforum ist: Vermutlich stecken im Freepascalcompiler bzw. in Lazarus noch mehr Optmierungspotential. Doch Vorsicht bei den Eliminationen mit vermeintlich oder tatsächlich schnelleren Alternativen: Die Ergebnisse sind nicht immer denen in/mit Delphi gleich und können auch inkonsistent sein, siehe http://bugs.freepascal.org/view.php?id=20853.
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#7

AW: Schnelle Alternativen für Multiplikation mit 2

  Alt 23. Jan 2012, 09:06
Wenn überhaupt ist der sog. "Freepascal-Bug" ein Delphi-Bug: pred und succ sollten den gleichen Ergebnistyp haben wie das Argument. FreePascal, BorlandPascal und VirtualPascal machen das auch, nur Delphi in seiner unendlichen Weisheit definiert
function Pred(X: Ordinal): Integer; und behauptet dann noch frech:
Zitat:
The result, of the same type as X, is the predecessor of X.
(Quelle: http://docwiki.embarcadero.com/Libraries/en/System.Pred) Mit folgendem Programm
Delphi-Quellcode:
{$Q-,R-}
var
  b,c: byte;
begin
  b := 0;
  c := pred(b);
  writeln(c:6, pred(b):6);
end.
liefern FPC, BP7 und VP2.1 jeweils 255 255, die Delphi-Versionen D2 .. D12 allerdings 255 -1
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#8

AW: Schnelle Alternativen für Multiplikation mit 2

  Alt 16. Jan 2012, 14:25
Wenn man Ahnung davon hat (ich habe sie nicht), dann kann man sich die verschiedenen Varianten ja einmal im resultierenden Assembler-Code ansehen.
Klar

Allerdings denke ich, dass, wenn überhaupt Geschwindigkeitsunterschiede bestehen sollten, diese wahrscheinlich allenfalls marginal sind. Wichtiger ist es IMO, dass der Code lesbar und nachvollziehbar (und somit auch leicht wartbar) ist.
Jain. Kommt auf das Einsatzgebiet an. Wenn es hochperformant sein soll, dann spielt es natürlich eine Rolle.
Bei solchen Unklarheiten wende ich Trick #17 an -> einen Geschwindigkeitstest machen.
Da sieht man dann anschließend, welche Variante schneller ist (am eigenen Rechner)
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.667 Beiträge
 
Delphi 12 Athens
 
#9

AW: Schnelle Alternativen für Multiplikation mit 2

  Alt 16. Jan 2012, 14:29
Wobei so ein Test aber auch nur dann aussagefähig ist, solange unter exakt gleichen Bedingungen verglichen wird.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.165 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Schnelle Alternativen für Multiplikation mit 2

  Alt 17. Jan 2012, 09:55
Warum ist alles langsammer als früher obwohl die Rechner 100x schneller geworden sind?

Weil keiner mehr optimiert...

Früher hab ich mit der Z80 Bibel von Rodnay Zaks für jede - wichtige - Routine die Taktzüglen zusammen addiert um zu schauen, ob ich nicht mit anderen Befehlen 2 oder 3 sparen kann.

Also warum nicht shl verwenden... Dann bist Du Dir sicher das es aus so benutzt wird... Falls der Compiler es anders sieht!

Mavarik
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 00:52 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