[fpc-pascal] AnsiStrings and Memory Management

Florian Klaempfl florian at freepascal.org
Thu Dec 15 10:10:17 CET 2005


Peter Vreman wrote:

>>>(astonishing that  ShortStrings are slower than AnsiStrings in this
>>>example
>>
>>in delphi).
>>
>>Not really. Delphi is silently upcasting your shortstrings to AnsiStrings
>>in
>>the background. You would probably have to recompile the VCL to get around
>>this ;-)
> 
> 
> I've commited a few small fixes to improve performance, please try again
> with current 2.1.1 from svn

It's enough to get as fast as D7 :) I guess to get more speed we need:
1) subroutine generation without entry/exit code
2) better register allocation for small procedures

else we can't compete with the hand optimized assembler routines of the delphi
rtl: fpc_unique_string is used a lot here which looks like:

.globl	fpc_ansistr_unique
fpc_ansistr_unique:
.globl	FPC_ANSISTR_UNIQUE
FPC_ANSISTR_UNIQUE:
# Temps allocated between ebp-8 and ebp+0
	pushl	%ebp
	movl	%esp,%ebp
	subl	$8,%esp
	movl	%ebx,-8(%ebp)
	movl	%esi,-4(%ebp)
# Var S located in register
# Var $result located in register
	movl	%eax,%ebx
# [437] pointer(result) := pointer(s);
	movl	(%ebx),%esi
# [438] If Pointer(S)=Nil then
	testl	%esi,%esi
	je	.L4159
.L4164:
# [440] if PAnsiRec(Pointer(S)-Firstoff)^.Ref<>1 then
	movl	(%ebx),%eax
	subl	$8,%eax
	movl	(%eax),%eax
	cmpl	$1,%eax
	je	.L4166
# [441] result:=fpc_truely_ansistr_unique(s);
	movl	%ebx,%eax
	call	SYSTEM_FPC_TRUELY_ANSISTR_UNIQUE$POINTER$$POINTER
	movl	%eax,%esi
.L4166:
.L4159:
# [442] end;
	movl	%esi,%eax
	movl	-8(%ebp),%ebx
	movl	-4(%ebp),%esi
	leave
	ret

Making it "frameless" safes 4 instructions.

Being able to put result into eax saves at least another 4. result could be put
in eax if the compiler recognizes that it doesn't have to save result while the
fpc_truely_ansistr_unique(s) call because result is assigned after it. Is this
doable (Daniel, Peter)?

Further, using ebx for s isn't necessary because after the
fpc_truely_ansistr_unique call s isn't used anymore. Could save another 2
instructions.




More information about the fpc-pascal mailing list