Page 2 of 2

Re: String

Posted: Wed Jan 10, 2018 6:13 pm
by Olliv
CELTIC88 wrote:Last edited by CELTIC88 on Wed Jan 10, 2018 7:12 am, edited 1 time in total.
wilbert wrote:Complex instructions like LODSW, STOSW and LOOP are usually slower.
CELTIC88' original code before his latest modifying :

Code: Select all

DisableDebugger
EnableASM
Procedure LODSandSTOS(d, l) ;Size 22 byte
CompilerIf #PB_Compiler_Unicode
Macro _SUA:W:EndMacro
CompilerElse
Macro _SUA:B:EndMacro
CompilerEndIf
PUSH esi edi ebx
MOV bl ,'>'
MOV ecx, [esp + 8 + 12]
MOV esi, [esp + 4 + 12]
MOV edi, [esp + 4 + 12]
!looop:
LODS#_SUA
CMP Al, '>'
JNE .__skip
XOR bl, 2
MOV Al,bl
!.__skip:
STOS#_SUA
LOOP looop
POP ebx edi esi
EndProcedure
STRr.s = ">>>>>>>>>>>>>>>xXXX<<<<"
LODSandSTOS(@STRr)
MessageRequester("", STRr)
EnableDebugger
If you had added normally your faster code, the beginners could more easily observe the speed difference between

Code: Select all

Loop Label
and

Code: Select all

Test AL, AL
Jnz Label
and cross this with info of wilbert.
:lol:

Re: String

Posted: Wed Apr 11, 2018 7:49 pm
by Michael Vogel
Short question, why is the iteration RegularSortBrakes3 slower than RegularSortBrakes2?

Code: Select all

#Tokbit='.'

Procedure.s RegularSortBrakes0(*s.Character)

	Protected symbol='<'

	While *s\c

		If *s\c=#Tokbit
			*s\c=symbol
			symbol!2
		EndIf

		*s+SizeOf(Character)
	Wend

EndProcedure
Procedure.s RegularSortBrakes1(*ptrChar.Character)

	EnableASM

	MOV al,62 ;>
	MOV ebp,dword [p.p_ptrChar]

	DEC ebp
	CompilerIf #PB_Compiler_Unicode
		DEC ebp
	CompilerEndIf

	!jump1:
	CompilerIf #PB_Compiler_Unicode
		INC ebp
	CompilerEndIf

	INC ebp
	MOV bl,byte [ebp]
	CMP bl,0
	JZ efin1
	CMP bl,#Tokbit
	JNE jump1

	XOr al,2
	MOV byte [ebp],al
	JMP jump1
	!efin1:

	DisableASM

EndProcedure
Procedure.s RegularSortBrakes2(*ptrChar.Character)

	EnableASM

	MOV al,62 ;>
	MOV ebp,dword [p.p_ptrChar]
	JMP jumpStart

	!jumpLoop:
	CompilerIf #PB_Compiler_Unicode
		INC ebp
	CompilerEndIf
	INC ebp

	!jumpStart:
	MOV bl,byte [ebp]
	CMP bl,0
	JZ jumpExit
	CMP bl,#Tokbit
	JNE jumpLoop

	XOr al,2
	MOV byte [ebp],al
	JMP jumpLoop
	!jumpExit:

	DisableASM

EndProcedure
Procedure.s RegularSortBrakes3(*ptrChar.Character)

	EnableASM

	MOV al,62 ;>
	MOV ebp,dword [p.p_ptrChar]
	JMP jumpStart

	!jumpLoop:
	CompilerIf #PB_Compiler_Unicode
		INC ebp
	CompilerEndIf
	INC ebp

	!jumpStart:
	MOV bl,byte [ebp]
	CMP bl,0
	JZ jumpExit
	CMP bl,#Tokbit
	JE jumpChange
	
	CompilerIf #PB_Compiler_Unicode
		INC ebp
	CompilerEndIf
	INC ebp
	MOV bl,byte [ebp]
	CMP bl,0
	JZ jumpExit
	CMP bl,#Tokbit
	JE jumpChange
	
	CompilerIf #PB_Compiler_Unicode
		INC ebp
	CompilerEndIf
	INC ebp
	MOV bl,byte [ebp]
	CMP bl,0
	JZ jumpExit
	CMP bl,#Tokbit
	JNE jumpLoop
		
	!jumpChange:
	XOr al,2
	MOV byte [ebp],al
	JMP jumpLoop
	!jumpExit:

	DisableASM

EndProcedure


#Q=#DOUBLEQUOTE$
#N=100000
t.s="<"+#Q+"name"+#Q+"iiiiiii|iiiiiiii|iiiiiiiii|iiiiiiiiiiiiiiiiiiiiiiiiiiii|iiiiiiii|iiiiiiiiii|iiiiiiiiiiiiiiiiiiiiiiiiiiii|iiiiiiiiiiiiiiii|iiiiiiiiiiiiiiiii|iiiiiiiii|iii|iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii|iiiiiiiiiiiiiiiiii|iiiiiiiiii|iiiiiiii|iiiiiiiiiiiiiiiiiiiiiii|iiiiiiiiiiiiiii|iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii|iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii|iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii|iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii|iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii|iiiiiiiiii|iiiiiiiii|iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii|iiiiiiiiiiiiiiiiiiiiiiiiiiiiiii|iiiiiiiiiiiii|iiiiiiiiiii|iiiiiiiiii>< S| - S><\d\d>e<\d\d>< | - ><*?><<<iiii>< *><\d*>< >>|< >|<>><<iiiiiiiiii|iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii>><*>?:=?:=?:=?:="
t+".hallo..a..b..c..d..e..f..g..h..i..j..k..l..m..n..o..p..q..r..s..t..u..v..w..x..y..z."

z+ElapsedMilliseconds()
For i=1 To #N>>10
	s.s=t
Next i
z-ElapsedMilliseconds()
z<<10
For i=1 To #N
	s.s=t
	For j=0 To 9
		RegularSortBrakes3(@s)
	Next j
Next i
z+ElapsedMilliseconds()

MessageRequester(Str(z)+"ms",s)