SQR vs. **

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2805
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

SQR vs. **

Beitrag von m.fuchs »

Hallo,

ich wollte gerade mal einen Speedvergleich für Distanz und QuadratDistanz zwischen zweier Vektoren machen und dabei ist mir eine Kleinigkeit aufgefallen.
Man kann ja - nach Einbindung der Unit Math - für Potenzen den Operator ** benutzen.
Also statt

Code: Alles auswählen

d := Sqr(x)
funktioniert auch

Code: Alles auswählen

d := x ** 2
Ich habe immer die zweite Variante benutzt, weil sie mir lesbarer erscheint. Allerdings ist sie auch deutlich langsamer als Sqr.
Bei 100 Millionen Berechnungen sieht man den Unterschied deutlich.

Code: Alles auswählen

100000000 calculations...
x ** 2         :3994 ms
Sqr(x)         :148 ms
x * x          :143 ms
Faktor 25 ist ja eventuell relevant. Eben beispielsweise bei Vektorberechnungen, die ja auch mal gehäuft vorkommen können (3D-Development).

Das soll nur eine kleine Info sein, aber vermutlich wissen das einige auch schon.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
Zvoni
Beiträge: 363
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: SQR vs. **

Beitrag von Zvoni »

Eigentlich logisch

sqr ist ein compiler-intrinsic, während ** ein "manueller" operator ist, welcher intern die Funktion "intpower" (für Integers) aufruft, und dort eben sogar durch ne Schleife lauft
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: SQR vs. **

Beitrag von Mathias »

Faktor 25 ist ja eventuell relevant. Eben beispielsweise bei Vektorberechnungen, die ja auch mal gehäuft vorkommen können (3D-Development).
Kannst du mal das testen "power(x, 2)" ?
Ich denke, dies wird etwa so lahm sein wie **.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2805
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: SQR vs. **

Beitrag von m.fuchs »

Zvoni hat geschrieben: Mo 17. Feb 2025, 16:00 sqr ist ein compiler-intrinsic,
Ist das so? Ich dachte bei einem Compiler-Intrinsic gibt es gar keine Möglichkeit zu einem Quellcode zu kommen, wenn man Ctrl+Leftclick auf den Bezeichner macht?
Bei WriteLn passiert nix, aber bei Sqr komme ich zur mathh.inc:

Code: Alles auswählen

function Sqr(d : ValReal) : ValReal;[internproc:fpc_in_sqr_real];
Gibt es zwei Möglichkeiten für Intrinsics? Oder ist das wieder was anderes?
Mathias hat geschrieben: Mo 17. Feb 2025, 19:43 Kannst du mal das testen "power(x, 2)" ? Ich denke, dies wird etwa so lahm sein wie **.
Jo, das ist alles auf dem gleichen Level:

Code: Alles auswählen

100000000 calculations...
x ** 2         :3871 ms
Sqr(x)         :142 ms
x * x          :144 ms
Power(x, 2)    :3617 ms
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

PascalDragon
Beiträge: 945
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: SQR vs. **

Beitrag von PascalDragon »

m.fuchs hat geschrieben: Mo 17. Feb 2025, 20:20
Zvoni hat geschrieben: Mo 17. Feb 2025, 16:00 sqr ist ein compiler-intrinsic,
Ist das so? Ich dachte bei einem Compiler-Intrinsic gibt es gar keine Möglichkeit zu einem Quellcode zu kommen, wenn man Ctrl+Leftclick auf den Bezeichner macht?
Bei WriteLn passiert nix, aber bei Sqr komme ich zur mathh.inc:

Code: Alles auswählen

function Sqr(d : ValReal) : ValReal;[internproc:fpc_in_sqr_real];
Gibt es zwei Möglichkeiten für Intrinsics? Oder ist das wieder was anderes?
Es kommt eben drauf an wie das Intrinsic implementiert ist. Wenn man ein Intrinsic hat, dass sich mit Standardsprache deklarieren lässt, dann ist es auch meist so implementiert wie hier beim Sqr. Write(Ln) jedoch besteht jedoch aus mehreren Funktionen (je nachdem wie viele Parameter involviert sind), demnach kann man da keine einzelne Funktion angeben.
FPC Compiler Entwickler

Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: SQR vs. **

Beitrag von Mathias »

Write(Ln) jedoch besteht jedoch aus mehreren Funktionen (je nachdem wie viele Parameter involviert sind), demnach kann man da keine einzelne Funktion angeben.
Write, WriteLn, WriteStr, Read und ReadLn sind echt spezielle Funktionen. Irgendwie dürfte es sowas eigentlich gar nicht geben.
Ich vermute dies sind Altlasten von TP 1.0.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Stevie
Beiträge: 162
Registriert: Di 27. Feb 2024, 22:40

Re: SQR vs. **

Beitrag von Stevie »

Ich vermute dies sind Altlasten von TP 1.0.
Mitnichten. Die beschreibt Wirth schon im "Pascal User Manual and Report" von 1974, also lange, bevor Turbo Pascal auf den Markt kam.

Antworten