Page 1 of 1

FindStr - slow

Posted: Tue Mar 07, 2023 3:23 am
by AZJIO
I changed it to pointers, now it's faster, 30 and 12, the difference is slightly more than 2 times.
I found an interesting topic

Code: Select all

EnableExplicit
DisableDebugger

Procedure FindStr(*c.Character, *fc.Character)
	Protected *FStart0, *Start0

	If Not *fc\c
		ProcedureReturn #False
	EndIf

	; + StartPosition * SizeOf(Character)
	*FStart0 = *fc
	*Start0 = *c

	While *c\c
		While *c\c = *fc\c And *c\c
			*fc + SizeOf(Character)
			*c + SizeOf(Character)
		Wend
; 		If *fc - *FStart0
		If *fc <> *FStart0
			If *fc\c
				*c - *fc + *FStart0
				*fc = *FStart0
			Else
				ProcedureReturn (*c - *Start0 - *fc + *FStart0) / SizeOf(Character) + 1
			EndIf
		EndIf
		*c + SizeOf(Character)
	Wend

	ProcedureReturn #False
EndProcedure

Define txt$ = "Hi guys"
; EnableDebugger
; Debug FindStr(@txt$, @"s")
; DisableDebugger
; End

Define t, i
t = ElapsedMilliseconds()
For i = 0 To 1000000
	FindStr(@txt$, @"s")
Next
EnableDebugger
Debug Str(ElapsedMilliseconds() - t)


DisableDebugger
t = ElapsedMilliseconds()
For i = 0 To 1000000
	FindString(txt$, "s")
Next
EnableDebugger
Debug Str(ElapsedMilliseconds() - t)

Re: FindStr - slow

Posted: Tue Mar 07, 2023 4:15 am
by idle
It you want fast findstring replacement function just use Wilbert's finddata module. Use an SSE search for needles <= 16 bytes, otherwise use Boyer Moore. A lot of time and research went into that module.