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