AW: Geschwindigkeitsunterschiede Apple Sillicon / Intel Win32 / Win64
Zitat:
Der Overhead von Int64 unter 32bit ist messbar aber keineswegs auch nur annäherend in Bereich x10 Zitat:
Der Messwert bei swift sieht auch aus, als ob da etwas ähnliches passiert. |
AW: Geschwindigkeitsunterschiede Apple Sillicon / Intel Win32 / Win64
Zitat:
|
AW: Geschwindigkeitsunterschiede Apple Sillicon / Intel Win32 / Win64
Delphi 11.3 Alexandria, Build Release (Standardeinstellungen), Prozessor Intel(R) Core(TM) i5 3.20GHz
Delphi-Quellcode:
uses
mormot.core.base, mormot.core.perf; const RUN_COUNT = 1000000000; var timer: TPrecisionTimer; begin timer.Start; var sum: Int64 := 0; for var i: Integer := 1 to RUN_COUNT do // sum := sum + 1; Inc(sum); ShowMessage(Format('Laufzeit: %s (%d us), Summe: %d', [timer.Stop, timer.StopInMicroSec, sum]));
Verwende ich sum in der Ausgabe (ShowMessage) nicht, sehen die Ergebnisse für 32-Bit so aus:
Alle Messwerte in mehreren Durchläufen verifiziert. Bis bald... Thomas |
AW: Geschwindigkeitsunterschiede Apple Sillicon / Intel Win32 / Win64
Zitat:
|
AW: Geschwindigkeitsunterschiede Apple Sillicon / Intel Win32 / Win64
Zitat:
Zitat:
Mit + bekomm ich diese Ergebnisse: Win32: ca 290ms Win64: ca 220ms Außerdem ist es immer gefährlich den Zeitmessungscode und die Ausgabe, welche fast immer strings beinhaltet mit in dieselbe Routine zu packen, wie den Code, den man messen möchte. Das kann u.U. katastrophale (im Sinne der gemessenen Zeit) haben, da der Compiler für strings und andere gemanagte Typen ein implizites try/finally erzeugt und dieses besonders unter 32bit dafür sorgt, dass der Compiler jegliche werte immer über den Stack bezieht anstatt sie in Registern zu behalten. Zurück zum Inc auf 32bit: Erzeugt diesen code:
Code:
add dword ptr [ebp-$18],$01
adc dword ptr [ebp-$14],$00
Delphi-Quellcode:
erzeugt diesen:
sum := sum + 1;
Code:
"Aber Stevie, das ist doch mehr Code, warum läuft der langsamer?"
mov eax,[ebp-$18]
mov edx,[ebp-$14] add eax,$01 adc edx,$00 mov [ebp-$18],eax mov [ebp-$14],edx Dafür müssen wir uns mal anschauen, wie die Timings dieser Befehle sind und dazu kann man dieses Dokument zurate ziehen. Genauer gesagt, schauen wir uns add und adc mit den Operanden m,r/i an (das, was Inc erzeugt) - ich nehme dafür die Timings von Icelake auf Seite 349. Wenn wir in die Spalte Latency gehen, sehen wir dort eine für die Performance vernichtende 7. Der Code, welcher für die Addition genutzt wird nutzt add und adc mit den Operanden r,r/i, die eine Latenz von 1 haben. Die zusätzlichen mov Befehle werden hier vermutlich durch die sogenannte "mov elimination" von der CPU entfernt, da sie erkennt, dass man immer nur denselben Wert schreibt und liest (das ist aber unbestätigt und nur eine Vermutung meinerseits, dafür müsste ich den Code genauer profilen). |
AW: Geschwindigkeitsunterschiede Apple Sillicon / Intel Win32 / Win64
Ja. Sicherlich.
Aber darum geht/ging es doch (siehe Betreff) |
AW: Geschwindigkeitsunterschiede Apple Sillicon / Intel Win32 / Win64
Zitat:
|
AW: Geschwindigkeitsunterschiede Apple Sillicon / Intel Win32 / Win64
Wäre es denkbar dass solche krassen Unterschiede x10 auch durch Intel vs.AMD kommen könnten?
Hier wird wohl Intel favorisiert, aber ich vermute AMD liegt da gleichauf. Oder ist das eine falsche Annahme ? |
AW: Geschwindigkeitsunterschiede Apple Sillicon / Intel Win32 / Win64
Zitat:
Sicher das der Compiler das
Delphi-Quellcode:
nicht einfach wegoptimiert?
Inc(Sum)
Ein schlauer Compiler könnte sogar die Schleife wegoptimieren
Delphi-Quellcode:
.
Inc(Sum, RUN_COUNT)
Wichtig ist sicher, ob der erzeugte Code für die Schleife vollständig in die Befehlswarteschlange des Prozessorkerns passt und die Sprungvorhersage richtig liegt. |
AW: Geschwindigkeitsunterschiede Apple Sillicon / Intel Win32 / Win64
Zitat:
Solang nicht detailiertere Information vorliegen vermute ich entweder die Virtualisierungs-/Emulationssschicht oder das Benutzen von Inc anstatt +1 als Ursache. In dem zuvor verlinkten Dokument stehen auch die Instructiontimings von AMD einschließlich Zen 4. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:25 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