Page 1 of 1

atof Replacement for ValD

Posted: Mon Oct 06, 2025 7:22 am
by Oliver13
Following the hints in viewtopic.php?t=87644, I verified that using atof is actually much more faster than built-in ValD().

Speed test for 100000 string conversions:
ValD: 785ms
with atof: 494

Below a small code that could be used as replacement, just comment out the macro (PB 32bit, Windows).

Code: Select all

ImportC ""
  atof.d(*txt) As "_atof"
EndImport

; Macro ValD ;-> uncomment to use new procedure instead of built-in
;   _ValD
; EndMacro


Procedure.d _ValD(str.s)
  Protected *mem=Ascii(str)
  dret.d=atof(*mem)
  FreeMemory(*mem)
  ProcedureReturn dret
EndProcedure


Define ret.d, i, u

Dim t$(10)
For i=0 To 10
  t$(i)=Str(Random(32767,0))+"."+Random(32767,0)
Next

iStart=ElapsedMilliseconds()
For u=0 To 100000
  For i=0 To 10
    ret=ValD(t$(i))
  Next i
Next u

Debug "Duration:"+Str(ElapsedMilliseconds()-iStart)



iStart=ElapsedMilliseconds()
For u=0 To 100000
  For i=0 To 10
    ret=_ValD(t$(i))
  Next i
Next u

Debug "Duration:"+Str(ElapsedMilliseconds()-iStart)

Re: atof Replacement for ValD

Posted: Mon Oct 06, 2025 8:02 am
by pjay
atof() doesn't work for me Oliver, I think it could be a 64 bit compatibility issue.

wtof() works though, and as this doesn't require the ascii conversion it's an order of magnitude faster. A downside for me was that it didn't handle conversion of PBs Binary (%) or Hexadecimal ($) prefixed strings.

Re: atof Replacement for ValD

Posted: Mon Oct 06, 2025 1:08 pm
by Piero
Did I misunderstood something?

Here on Mac M1 _ValD (atof) is far slower…
Duration ValD : 72
Duration _ValD: 790

…and I'm supposed to be here to criticize Fred!

Re: atof Replacement for ValD

Posted: Mon Oct 06, 2025 1:18 pm
by NicTheQuick
Three things:
1. You don't measure time in Debug mode.
2. An additional function call and string conversion adds a lot of time.
3. _atof does not exist on Linux it seems. But atof does. A version for UCS-2 strings like Purebasic uses them internally seems not to be available.

Re: atof Replacement for ValD

Posted: Mon Oct 06, 2025 1:22 pm
by NicTheQuick
These are my results:

Code: Select all

 ValD: 103 ms
_ValD: 123 ms
Using this code and with the Debugger disabled, C-backend and code optimization enabled:

Code: Select all

EnableExplicit

ImportC ""
	atof.d(*txt) As "atof"
EndImport

; Macro ValD ;-> uncomment to use new procedure instead of built-in
;   _ValD
; EndMacro


Procedure.d _ValD(str.s)
	Protected *mem = Ascii(str)
	Protected dret.d = atof(*mem)
	FreeMemory(*mem)
	ProcedureReturn dret
EndProcedure

OpenConsole()

Define ret.d, i, u, timeDiff

Dim t$(10)
For i = 0 To 10
	t$(i) = Str(Random(32767,0)) + "." + Random(32767,0)
Next

timeDiff = ElapsedMilliseconds()
For u = 0 To 100000
	For i = 0 To 10
		ret = ValD(t$(i))
	Next
Next

timeDiff = ElapsedMilliseconds() - timeDiff
PrintN(" ValD: " + timeDiff + " ms")



timeDiff = ElapsedMilliseconds()
For u = 0 To 100000
	For i = 0 To 10
		ret = _ValD(t$(i))
	Next
Next

timeDiff = ElapsedMilliseconds() - timeDiff
PrintN("_ValD: " + timeDiff + " ms")
Input()
CloseConsole()

Re: atof Replacement for ValD

Posted: Mon Oct 06, 2025 1:31 pm
by Piero
Just to try to criticize Fred: maybe calls to """ImportC""" are "not well implemented" for Mac ARM?

PS: only atof works here

Re: atof Replacement for ValD

Posted: Thu Oct 09, 2025 3:07 am
by Oliver13
Tx for feedback, but differences seem actually to be caused by C/ASM mode and/or 32/64bit mode.

Compiling following code on x86, Windows, ASM mode, results here in a gain of speed with _ValdD by nearly 50% ... :D

PB 6.21: (with debugger)
ValD: 1193 ms
_ValD: 511 ms

PB 6.21: (no debugger)
ValD: 1144 ms
_ValD: 293 ms


PB 6.11: (with debugger)
ValD: 1197 ms
_ValD: 519 ms

PB 6.11: (no debugger)
ValD: 1211 ms
_ValD: 306 ms


PB 5.73: (with debugger)
ValD: 805 ms
_ValD: 497 ms

PB 5.73: (no debugger)
ValD: 767 ms
_ValD: 276 ms

PB 5.62: (with debugger)
ValD: 806 ms
_ValD: 491 ms

PB 5.62: (no debugger)
ValD: 760 ms
_ValD: 272 ms

Code: Select all

EnableExplicit

ImportC ""
	atof.d(*txt) As "_atof"
EndImport

; Macro ValD ;-> uncomment to use new procedure instead of built-in
;   _ValD
; EndMacro


Procedure.d _ValD(str.s)
	Protected *mem = Ascii(str)
	Protected dret.d = atof(*mem)
	FreeMemory(*mem)
	ProcedureReturn dret
EndProcedure

OpenConsole()

Define ret.d, i, u, timeDiff

Dim t$(10)
For i = 0 To 10
	t$(i) = Str(Random(32767,0)) + "." + Random(32767,0)
Next

timeDiff = ElapsedMilliseconds()
For u = 0 To 100000
	For i = 0 To 10
		ret = ValD(t$(i))
	Next
Next

timeDiff = ElapsedMilliseconds() - timeDiff
PrintN(" ValD: " + timeDiff + " ms")



timeDiff = ElapsedMilliseconds()
For u = 0 To 100000
	For i = 0 To 10
		ret = _ValD(t$(i))
	Next
Next

timeDiff = ElapsedMilliseconds() - timeDiff
PrintN("_ValD: " + timeDiff + " ms")
Input()
CloseConsole()

Btw,

Code: Select all

ImportC ""
	atof.d(*txt) As "atof"
EndImport
results in unresolved symbol error.

Re: atof Replacement for ValD

Posted: Thu Oct 09, 2025 5:46 am
by AZJIO
1. If you use Random(), then be sure to use RandomSeed(), only then your results can be compared. Otherwise, they will depend on lucky numbers.
2. The result with the debugger is not interesting, as it is used for code quality and will not be used in reality.