Seite 1 von 2

ASM - fyl2x langsammer als Log10 oder Log ?

Verfasst: 17.04.2018 18:55
von STARGÅTE
Hallo Leute,

ich wundere mich gerade etwas über die geschwindigkeit vom ASM Befehl fyl2x.
Wenn ich diesen für die Log2() Procedure nutzt (Quelle), ist diese Prozedur langsammer als das Log oder Log10 von PureBasic, obwohl diese ja wohl auch den Basisbefehl fyl2x nutzen und sogar mehrmals, oder?

Code: Alles auswählen

Procedure.d Log2(x.d)
  !fld1
  !fld qword [p.v_x]
  !fyl2x
  ProcedureReturn
EndProcedure


Define Time.i, Time2.i, Time10.i, TimeE.i, I.i

#Loops = 10000000


Time = ElapsedMilliseconds()
For I = 1 To #Loops
	Log2(I)
Next
Time2 = ElapsedMilliseconds() - Time

Time = ElapsedMilliseconds()
For I = 1 To #Loops
	Log10(I)
Next
Time10 = ElapsedMilliseconds() - Time

Time = ElapsedMilliseconds()
For I = 1 To #Loops
	Log(I)
Next
TimeE = ElapsedMilliseconds() - Time

MessageRequester("", "Log2() --> "+StrD(1.e6*Time2/#Loops)+"ns"+#LF$+"Log10() --> "+StrD(1.e6*Time10/#Loops)+"ns"+#LF$+"Log() --> "+StrD(1.e6*TimeE/#Loops)+"ns")
---------------------------

---------------------------
Log2() --> 49.9ns
Log10() --> 39.6ns
Log() --> 36.7ns
---------------------------
OK
---------------------------

Re: ASM - fyl2x langsammer als Log10 oder Log ?

Verfasst: 18.04.2018 07:59
von Lord
Hier mal meine Werte:
---------------------------

---------------------------
Log2() --> 24.5ns
Log10() --> 24.5ns
Log() --> 21.5ns
---------------------------
OK
---------------------------
Wobei diese variieren um etwa +- 2ns.
Grundsätzlich ist aber Log() immer etwa 2-3 ns schneller.

Getestet mit PB v5.62(x64).

Re: ASM - fyl2x langsammer als Log10 oder Log ?

Verfasst: 18.04.2018 10:25
von _JON_
PB benutzt die msvcrt.dll Funktionen für Log() und Log10().

Hab mal rein geschaut da ist eine Große Menge Code in den Funktionen,
allerdings kein fld1, fld oder fyl2x.

Re: ASM - fyl2x langsammer als Log10 oder Log ?

Verfasst: 18.04.2018 10:42
von NicTheQuick
Hier mal meine Werte:

Code: Alles auswählen

Log2() --> 22.17ns
Log10() --> 85.98ns
Log() --> 80.24ns
Die sind dann wohl doch deutlich anders. :-D
Mehrfaches Ausführen ändert nicht viel. Ich hab die Loops zwar verzehnfacht, aber das hat auch nicht viel geändert.

Re: ASM - fyl2x langsammer als Log10 oder Log ?

Verfasst: 18.04.2018 11:28
von STARGÅTE
@NicTheQuick:
Ja so in etwa hatte ich mir das vorgestellt. Hast du Intel?

Re: ASM - fyl2x langsammer als Log10 oder Log ?

Verfasst: 18.04.2018 11:34
von NicTheQuick
Jup, den da: Intel(R) Core(TM) i7-3820QM CPU @ 2.70GHz
Mittlerweile uralt, aber im Laptop immer noch rasend schnell :-D

Re: ASM - fyl2x langsammer als Log10 oder Log ?

Verfasst: 18.04.2018 13:16
von STARGÅTE
Komisch.
Ich habe es auch noch mal auf einem Intel(R) Core(TM) i5-4460 laufen lassen und da gibt er mir
Log2() --> 27.2ns
Log10() --> 18.2ns
Log() --> 15.4ns

Re: ASM - fyl2x langsammer als Log10 oder Log ?

Verfasst: 18.04.2018 13:35
von mk-soft
CPU: Intel(R) Core(TM) i7-3615QM CPU @ 2.30GHz

Mac OS 10.13.4
Log2() --> 27.3ns
Log10() --> 14.8ns
Log() --> 13.4ns
(VM) Linux Ubuntu 17.10
Log2() --> 26.2ns
Log10() --> 33.3ns
Log() --> 29ns
(VM) Window 7 Pro

Code: Alles auswählen

Log2() --> 26.4ns
Log10() --> 19.1ns
Log() --> 17.7ns

Re: ASM - fyl2x langsammer als Log10 oder Log ?

Verfasst: 04.05.2018 10:49
von Helle
Hey, hier fehlt doch noch mein Senf :mrgreen: ! Ich dachte aber, auf den absolut richtigen Hinweis (für Windows) von _JON_ springt jemand an. Dieser Hinweis erklärt ja auch (eventuelle) Unterschiede zwischen den einzelnen Betriebssystemen.
Unterschiede existieren aber (natürlich) auch zwischen den einzelnen Windows-Versionen. FYL2X wird in der msvcrt.dll (Versions-Nr.geschenkt) für Windows7 nur noch für die Funktion "pow" verwendet, in Windows10 (_JON_) schon nicht mehr.
Also: FYL2X hat nichts mit den PB-Funktionen LOG10 oder LOG zu tun! Um das ganz hervorragende (neue) IDA 7 Free zu testen habe ich damit mal die Funktion POW10 aus der msvcrt.dll (Windows7) "extrahiert" (ich Böser!). Da wird (natürlich) keine einzige x87-(FPU-)Instruktion verwendet, dafür aber ca. 1700 Bytes an Daten (Konstanten) :mrgreen: !
Interessant wäre ein Genauigkeits-Vergleich mit den Betriebssystemen, bei denen das FYL2X-Beispiel schneller ist als PB-POWx (oder besser: POW langsamer). Ist da z.B. POW10 genauer als in Windows? Konkretes Beispiel: Windows-PB-Log10(54321.123456789) liefert 4.7349687433423764. Die letzte Dezimal-Stelle (4) ist falsch, es müsste gerundet 3 sein (29...). Liefert z.B.Linux (Distribution?) hier die 3?

Re: ASM - fyl2x langsammer als Log10 oder Log ?

Verfasst: 04.05.2018 15:46
von ccode_new
Linux Mint 18.3 Cinnamon (64 bit)

Log10(54321.123456789)

liefert: 4.7349687433423763849305033

Log2() --> 27.6ns
Log10() --> 103.9ns
Log() --> 96.5ns

An Helle:
Die letzte Dezimal-Stelle (4) ist falsch, es müsste gerundet 3 sein (29...).
Wie kommst du denn darauf ?